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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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