Avatar billede soduno Novice
14. juni 2011 - 13:27 Der er 5 kommentarer og
1 løsning

fetch sql i samme tabel

Hejsa.

Jeg er ved at lave en oversigt over alle de sider der er oprettet i min database. I oversigten er der:


Navn
Tilhørende menu (kategori like)
Tilhørende undermenu (submenu like)


Min SQL sætning ser således ud:
SELECT * FROM mh_menu INNER JOIN mh_menu_cat ON menu_catid=menucat_id

Nu har jeg i tabellen mh_menu en række der hedder parent, der jo bestemmer hvilken anden menu den oprettede side hører til. Hvordan får jeg parent og id matchet korrekt sammen nu når det er samme tabel?

Spørg endelig hvis jeg taler russisk, det er jo nemt nok at forstå når jeg selv kender problemet. Ved godt min sql sætning ikke er performance optimeret, det er blot for at illustrere :)

Venlig Hilsen
Simon
14. juni 2011 - 14:06 #1
Lidt russisk er det nu.  Det at du har 'en række der hedder parent' lyder lidt mystisk.  Jeg ville have forventet at det ville være en kolonne-felt.  Jeg foreslår, at du viser opbygningen af de to tabeller, hvilke felter der er med hvilke datatyper.
Avatar billede soduno Novice
14. juni 2011 - 14:15 #2
Det er selvfølgelig en kolonne- my bad.

Oversigt over tabeller
mh_menu:
menu_id
menu_catid
menu_label
menu_parent

mh_menu_cat
menucat_id
menucat_name
menucat_menuid
Avatar billede majbom Novice
14. juni 2011 - 14:27 #3
på den måde kan du have alle de niveauer du vil - det tror jeg ikke du kan i én sql-sætning.

der skal du nok ud i en rekursiv funktion i php
15. juni 2011 - 08:01 #4
Jeg har stadig nogle spørgsmål.  Jeg går ud fra at menu_parent er fremmednøgle til menu_id, således at hvis du har en menu med label 'home' og en undermenu til 'home' der hedder 'contact', begge i category 7, så kunne mh_menu for eksempel se således ud:

1 7 home NULL
2 7 CONTACT 1

Altså home har ingen parent, og derfor er menu_parent fyldt ud med NULL.

Hvad er det så du vil have skrevet ud for hver menu?  Hvis du for hver menu vil have dens id, label, categorynavn, og navnet på parent menuen, så skulle denne query virke:

SELECT m1.menu_id, m1.menu_label, c.menucat_name, m2.menu_label AS parent
FROM mh_menu m1 JOIN mh_menu_cat c ON m1.menu_catid = c.menucat_id LEFT JOIN mh.menu m2 ON m1.menu_parent = m2.menu_id

Fordi du søger to ting i mh_menu, så forekommer tabellen to gange i forespørgslen.  For at gøre forespørgslen mere oversigtelig, har jeg givet tabellerne aliases (øgenavne), og mh_menu har således to forskellige aliaser, en for hver gang tabellen bliver brugt.  For at gøre udskriften tydeligere kalder jeg parent menuens menu_labelen for parent.

Så er det udenfor sp+ørgsmålet, men jeg kan ikke dy mig for at spørge hvad der står i menucat_menuid?  Forhåbenlig ikke en fremmednøgle (henvisning) til menu_id.  Det ville give cirkel-henvisninger du ville have svært ved at bruge og som jeg ikke tror du kan have brug for.  Jeg foreslår, at du dropper menucat_menuid.

Ligeledes kunne du gøre det mere oversigtelig ved at vælge simpler navne på dine felter, simpelthen:

mh_menu
id, catid, label, parent

mh_menu_cat
id, name

Så kan ovenstående forespørgsel forkortes til:

SELECT m1.id, m1.label, c.name, m2.label AS parent from mh_menu m1 HOIN mh_menu_cat c ON m1.catid = c.id LEFT JOIN mh.menu m2 ON m1.parent = m2.id
17. juni 2011 - 08:11 #5
s_dunn, så du mit indlæg?  Var det til nytte?  Eller har jeg misforstået problemet?  I så fald fortæl, så jeg kan prøve igen.
Avatar billede soduno Novice
17. juni 2011 - 20:02 #6
Undskyld jeg ikke har fået svaret tilbage. Det virkede helt perfekt, og det var lige det jeg havde brug for - Tak for det :)
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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