oliver: [MYSQL] Suche Hilfe bei kompliziertem Join

Moinsen,

das ist mein Problem:
Ich habe 2 Tabellen 'item' und 'category', die wegen einer n:m-Relation über eine Zwischentabelle 'i_to_c' miteinander verbunden sind. Ein einfaches JOIN-SELECT sieht dann so aus:

SELECT item
FROM
   item AS i,
   i_to_c AS t,
   category AS c
WHERE
   i.id_itm = t.id_itm AND
   t.id_cat = c.id_cat AND
   c.category = 'category'

(Selektiert alle Items der Kategorie 'category')

Jetzt benötige ich aber eine Selektion, in der alle Items der Kategorie 'a' UND alle Items der Kategorie 'b' enthalten sind, OHNE die Items, die in BEIDEN Kategorien enthalten sind!

Bin grade reichlich verwirrt, eigentlich sollte es einen einfachen Weg geben, meine Versuche waren jedoch relativ kompliziert und zudem völlig erfolglos...

Weiss jemand Rat?
Vielen Dank schonmal!

gruß oliver

  1. Tachsn,

    OHNE die Items, die in BEIDEN Kategorien enthalten sind!

    bei Mysql MAXDB gibt ist ASAF "EXCEPT" schon implementiert, beim "normalen" MySQL weiß ich nicht.

  2. SELECT item
    FROM
       item AS i,
       i_to_c AS t,
       category AS c
    WHERE
       i.id_itm = t.id_itm AND
       t.id_cat = c.id_cat AND
       c.category = 'category'
    Jetzt benötige ich aber eine Selektion, in der alle Items der Kategorie 'a' UND alle Items der Kategorie 'b' enthalten sind, OHNE die Items, die in BEIDEN Kategorien enthalten sind!

    Hi,

    das hört sich nach einer Antivalenz an. Falls nicht, möge man mir verzeihen, ist schon zwanzig Jahre her. Falls doch, und man definiere:

    A = (i.id_itm = t.id_itm)
      B = (t.id_cat = c.id_cat)

    dann sähe der Ausgang so aus:

    Q = (A AND NOT B) OR (NOT A AND B)

    Bei der Umsetzung solltest Du auf korrektes Klammern achten!

    HTH Robert

    1. das hört sich nach einer Antivalenz an. Falls nicht, möge man mir verzeihen, ist schon zwanzig Jahre her. Falls doch, und man definiere:

      A = (i.id_itm = t.id_itm)
        B = (t.id_cat = c.id_cat)

      Sorry, zu schnell abgeschickt ohne noch mal nachzulesen. Sollte so aussehen:

      A = ((i.id_itm = t.id_itm) AND (t.id_cat = c.id_cat) AND (c.category = 'a'))
        B = ((i.id_itm = t.id_itm) AND (t.id_cat = c.id_cat) AND (c.category = 'b'))

      So, und dann einsetzen, möglicherweise noch bool'sch vereinfachen...

      HTH Robert

  3. yo Oliver,

    Jetzt benötige ich aber eine Selektion, in der alle Items der Kategorie 'a' UND alle Items der Kategorie 'b' enthalten sind, OHNE die Items, die in BEIDEN Kategorien enthalten sind!

    SELECT item
    FROM item AS i, i_to_c AS t, category AS c
    WHERE i.id_itm = t.id_itm AND t.id_cat = c.id_cat AND (c.category = 'a' AND c.category <> 'b' OR c.category = 'b' AND c.category <> 'a')

    versuch das mal, habs selbst nicht getestet, nur eine vermutung von mir.

    Ilja

  4. Vielen Dank Euch allen!

    ich werd die verschiedenen Vorschläge jetzt mal ausprobieren.
    Ich fürchte nur es so nicht funktionieren wird, weil mir das ziemlich ähnlich aussieht mit dem, was ich selber zuvor schon probiert hatte.
    Das Problem ist, denke ich, das der Join über drei Tabellen geht, und im Endefekt keine Möglichkeit mehr besteht auf Ebene der Zwischentabelle i_to_c zu prüfen, ob das Item in beiden Kategorien enthalten ist. Aber mal sehen...

    Danke!

    gruß oliver