![]() |
Hämta kategorier från MySQL databas
Tjena
Jag har en tabell som innehåller kategorier. Kolumnerna är id, name, parent_id De som har parent_id = 0 är ju då sektioner kan man säga som i sin tur har kategorier i sig. Nu vill jag hämta alla kategorier och skriva ut dom till min meny (superfish) som ska ha följande struktur: Kod:
<ul> Tips på hur jag kan göra min SQL-query för att få ett bra svar som är lätt att skriva ut med t.ex. två st foreach. En för grundkategorier och en för underkategorier. Någon som har tips? :) |
Select * from kategorier where parent = 0
Sedan gör du en foreach ($row as $menuitem) där du först skriver ut parent och sedan kör en select * from kategorier where parent = $menuitem['parent'] och skriver ut dessa... Hoppas du fattade, är lite seg i skallen. |
Tackar.
Tänkte dock om man kunde löst det med en query, men det kanske inte är möjligt? Så man får en array med arrayer så att säga :) Annars får jag köra som du säger. |
Jo det går att köra EN query, du får helt enkelt joina tabellen med sig själv så att du får ut resultaten nånting i den här stilen
ParentId |ParentKategoriNamn| KategoriId |KategoriNamn Sen när du loopar ut allt så kollar du om ParentId ändrats, om så är fallet så skriver du ut ParentName och börjar en ny undermeny.. |
Citat:
|
Här är en bra artikel om hierarkiska datastrukturer i MySQL (och andra SQL-databaser för den delen):
http://dev.mysql.com/tech-resources/...ical-data.html Artikeln har flera olika förslag på tabellupplägg och frågor. |
Citat:
vad är mest resurs-snålt? a) Köra 1 +X querys mot databasen, där X är antalet huvudkategorier b) köra 1 query och låta koden hantera sorterandet |
Det blir ungefär samma antal frågor ändå med alla joins. Bättre att databasen får jobba än att du ska dra logiken i php, definitivt mer resurskrävande.
Vill du spara databaskraft ska du cacha databasuppslaget, då blir det inga frågor alls. :) |
Citat:
|
Det behövs ingen direkt logik eller fler än en databasfråga.
En simpel rekursiv funktion som skriver ut menyn som är lagrad i en array. |
Gör ni inte en liten tankevurpa nu?
"databasmotorn jobbar fan så mycket snabbare än php. " ja, men vad är det som skickar och tar emot saker till databasen, just det, php och för varje query så måste man ju kontakta databasen men det är just därför man skall låta databasmotorn jobba för att endast få ut den data man vill ha i ett format som är lätthanterligt. "Det blir ungefär samma antal frågor ändå med alla joins. " ursäkta? Det blir ju ETT anrop och sen får man ju se till att skriva en vettig query jag har en monster-query där jag joinar en tabell mot sig själv + att den innehåller 2 sub-selects som i sig innehåller en join.. den körs på ca 2-4 ms Jag gjorde ett litet test och körde bara en query där jag hämtar top-kategorierna, gissa vad, den tog lika lång tid. Eftersom underkategoriernas frågor ser likadana ut så skulle detta då innebära, med i mitt fall 17 top-kategorier,4ms + 17*4ms =72ms (eller i bästa fall 36ms) detta utan att ha räknat med eventuell tid det tar att skicka saker till sql-servern oavsett hur lång tid det tar så skall man självklart cacha resultatet så att man bara behöver göra en hämtning |
Citat:
|
Nu vet jag inte om jag är sent ute, men tror att en artikel jag skrev för ett par dagar sen kan vara användbar i det här sammanhanget: http://en.someotherdeveloper.com/art...h-calculation/
Den är väl en 95% färdig än så länge, och hittills finns den "bara" på engelska. Men hoppas att den är till nytta. :) |
Citat:
|
Det viktigaste är att frågan/frågorna är skalbara, så att det inte gör något om du lägger till eller tar bort nya kategorier/underkategorier. Eftersom du laddar menyn ofta men ändrar den sällan (min gissning) så är cachning vägen att gå för att minska belastningen.
|
Citat:
men i grunden så joinar jag tabellen med sig själv + att jag har med villkor för vilka kategorier som skall visas baserat på om det finns något innehåll under dessa (dessutom har jag ett par fula subquerys) tror inte att TS skulle vara SÅ behjälpt av denna ;) Kod:
SELECT p.sortOrder,p.prodcatID as TopCatID, |
Citat:
|
Hej igen!
Jag har inte glömt bort tråden, men har varit lite upptagen :) Jag löste det med två queries, en som hämtar alla grundkategorier och en som hämtar alla "barn" och sen loopade jag ut det med PHP. Nu har jag dock tänkt om lite och behöver hjälp igen då jag har kört fast. Jag har nu en array med arrayer som ser ut såhär: Kod:
array(11) { Jag provade att loopa ut allt såhär som test, men det fungerar inte. Får en blank skärm. Kod:
<? $i=0; ?> EDIT: Löste det. Min lilla exempelkod ser ut såhär om nån är nyfiken: Kod:
<? $i=0; ?> |
Alla tider är GMT +2. Klockan är nu 07:35. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson