Einzelnen Beitrag anzeigen
  #1  
Alt 08.01.2012, 21:47:30
droehn droehn ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 51
Beiträge: 19
JOIN ON (a,b,c) = (d,e,f,g) - wie geht das?

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

Geändert von droehn (08.01.2012 um 22:13:55 Uhr)
Mit Zitat antworten