[MYSQL] Suche Hilfe bei kompliziertem Join
oliver
- datenbank
0 MySQLslammer0 srob0 srob
0 Ilja0 oliver
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
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.
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
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
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
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