Avatar billede htx98i17 Professor
09. juni 2017 - 16:54 Der er 2 kommentarer og
1 løsning

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 :)
Avatar billede htx98i17 Professor
11. juni 2017 - 07:55 #1
Er det for forvirrende forklaret?

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 :)
Avatar billede htx98i17 Professor
13. juni 2017 - 14:41 #2
Jeg tillader mig lige at pinge dette spørgsmål i toppen, i håb om at nogen har mod på at  give det et skud.
Avatar billede htx98i17 Professor
13. juni 2017 - 16:17 #3
Hvis jeg nu viser jer hvad jeg har fundet frem til, så kan I måske kommentere på det.
Denne ser ud til at fungere for mig:



SELECT ts0.label, ts0.id, ts0.relation, ts1.label, ts1.id, ts1.relation, ts2_3.label, ts2_3.id, ts2_3.relation
                               
FROM tblstruktur ts2_3

JOIN tblartikler ta ON
    ts2_3.id = ta.position
   
JOIN tblstruktur ts1 ON
    ts1.id = ts2_3.relation

LEFT JOIN tblstruktur ts0 ON
    ts0.id = ts1.relation
   
WHERE
    ta.id = ?
   
LIMIT 1





Hvis ts0.id har en værdi er der tale om et produkt i 3. niveau
Hvis ej, så er der tale om et produkt i 2. niveau
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester