SQL find produktets placering i menustrukturen
Jeg skal finde frem til placeringen af et produkt i en menustruktur med 3 niveauer ud fra kun produkt-id'et.Menu tabelstruktur:
tblstruktur
->id <- primærnøgle
->relation <-fremmednøgle for niveauet over
->label
Produkt tabelstruktur:
tblprodukter
->id
->position <- fremmednøgle for tblstruktur.id
->label
Der findes 3 niveauer i menustrukturen
Der findes aldrig produkter i 1. niveau.
Der findes produkter i 2. eller 3. niveau, men der findes ikke produkter i 2. niveau hvis der er i det 3. niveau.
Indholdet i databasen kunne se således ud:
tblstruktur
id relation label
----------------------------------
1 Æbler
2 1 Grønne
3 1 Røde
4 2 Små
5 2 Store
tblprodukter
id position label
---------------------------------
1 5 Stort grønt æble
2 3 Rødt æble
Bemærk at der ikke er produkter i tblstruktur.id#2 fordi der findes et niveau under denne gruppe.
Spørgsmålet er:
Hvordan skal en SQL (mysqli) se ud, hvis jeg skal finde ID og LABEL på de 2 eller 3 niveauer produkter befinder sig i, når jeg kun kender til tblprodukter.id som spørgsmålstegnet repræsenterer?
Jeg har selv bl.a. forsøgt nedenstående samt mange omrokeringer. Hvis vi nu er ude i noget HAVING eller X-join eller et kald i et kald, så kunne det være fint at lære det.
SELECT ts.label AS k1, ts2.label AS k2, ts3.label AS k3, ts.id AS k1_id, ts2.id AS k2_id, ts3.id AS k3_id
FROM tblprodukter tp
JOIN tblstruktur ts ON //denne skulle gerne finde 1. niveau
ts.id = ts2.relation
JOIN tblstruktur ts2 ON //denne skulle gerne finde 2. niveau
ts2.id = ts3.relation
OR ts2.id = tp.position
LEFT JOIN tblstruktur ts3 ON //denne skulle gerne eventult finde 3. niveau
ts3.relation = ts2.id
AND tp.position = ts3.id
WHERE
tp.id = ?
Ovenstående eksempel siger "Unknown column 'ts2.relation' in 'on clause'"
Og det er nok fordi der er skrudder mudder i SQL'en, for tidligere spørgsmål på eksperten vil vidne at tblstruktur.relation rent faktisk er det feltet hedder :)
Hvis jeg havde produkt-id #1 og SQL'en fungerede, ville resultatet af udtrækket se således ud:
1 række med følgende værdier:
k1: Æbler
k2: Grønne
k3: Store
k1_id: 1
k2_id: 2
k3_id: 5
Nu håber jeg ikke jeg har skrevet forkert nogle steder :)