Moin allerseits,
Hoffentlich war der Titel nicht zu verwirrend, aber ich weiss einfach nicht, mit welchen Worten die Sache am Besten zu beschreiben ist ;-).
Für eine Artikelzuordnung und -abfrage nach Gruppen speichere ich Letztere in einer Nested Set Struktur und ordne in einem zweiten Schritt die Artikel der 'gruppe'-id zu:
Code:
Tabelle 'artikel' Tabelle 'gruppe'
id | artikel | gruppeid id | titel | links | rechts
1 | Rosinenbrot | 2 1 | Gebäck | 1 | 6
2 | Rosinenbrot | 6 2 | Brot | 2 | 3
3 | Apfelkuchen | 3 3 | Kuchen | 4 | 5
4 | Apfelkuchen | 5 4 | Frucht | 6 | 14
5 | Gugelhupf | 3 5 | Apfel | 7 | 12
6 | Gugelhupf | 6 6 | Rosine | 8 | 9
7 | Eiffeltorte | 3 7 | Birne | 10 | 11
8 | Eiffeltorte | 5 8 | Kirsche | 12 | 13
9 | Eiffeltorte | 7
Wenn der Anwender nun alle Erzeugnisse mit Rosinen sehen möchte, würde es reichen, dem Statement die Gruppen-ID zu übergeben. Da aber auch eine Suche nach allen Erzeugnissen mit Früchten möglich sein muss, würde die Gruppen-ID 4 übergeben werden, was auf der Artikel-Tabelle nirgends verzeichnet ist. Daher übergebe ich immer die Werte für 'links' und 'rechts', um zunächst die möglichen ID-Nummern auf der 'gruppe' Seite einzugrenzen. Für 'Frucht' sähe das so aus
Code:
SELECT
a.artikel
FROM
artikel AS a
LEFT JOIN
gruppe AS b
ON (
(
6 >= b.links
AND
14 <= b.rechts
AND
b.id = a.gruppeid
)
)
GROUP BY
a.artikel
Auch soweit wäre das kein Problem. Wenn der Anwender jetzt alle Brote mit Früchten sehen möchte, wird's allerdings schwierig. Ich versuche schon den ganzen Tag lang die Eingrenzung zu kombinieren, kriege aber bestenfalls alle Brote angezeigt - allerdings auch die ohne Früchte.
Ich hatte die Hoffnung, mittels GROUP_CONCAT erstmal alle gewünschten IDs aus 'gruppe' einzugrenzen (Brot, Frucht, Apfel, Rosine, Birne, Kirsche) und dagegen GROUP_CONCAT 'gruppeid' aus 'artikel' vergleichen zu können:
Code:
Gruppe: gruppe.id
'alle Brote mit Früchten' (2,4,5,6,7,8)
Artikel: artikel.gruppeid
Rosinenbrot (2,6) ja!
Apfelkuchen (3,5) nein, keine 3
Gugelhupf (3,6) nein, keine 3
Eiffeltorte (3,5,7) nein, keine 3
Also etwa so:
Code:
SELECT
a.artikel
FROM
artikel AS a
WHERE
a.gruppeid IN
(
SELECT
GROUP_CONCAT(b.id SEPARATOR ',')
FROM
gruppe AS b
WHERE
(
2 >= b.links
AND
3 <= b.rechts
)
OR
(
6 >= b.links
AND
14 <= b.rechts
)
)
Offenbar ist so ein Vergleich in MySQL nicht möglich. In der Zwischenzeit brummt mir der Schädel und bevor ich hier zum Fenster rausspringe, wollte ich hier mal nachfragen, ob sich jemand mit diesem Problem schon einmal auseinandergesetzt hat oder auf andere wunderbare Weise mir einen Tip geben kann.
Vielen Dank und bis denne!
David