Jeg ville bruge ORDER BY category
i stedet. Du kan derefter gentage resultatsættet som
$old = null;
foreach ($st as $s) {
if $old != $s['id']
echo 'Main category';
$old = $s['id'];
echo 'subcategory'
Opdater
Der findes tre mulige løsninger indtil nu i denne tråd på selve problemet.
Original mulighed 1
SELECT * FROM content group by category
foreach
SELECT * FROM content WHERE category=$cat['category']
Hvis man kun ønsker at få hver overordnet kategori én gang, skal man bruge DISTINCT
i stedet. Man bør ikke bruge GROUP BY
uden at bruge nogen aggregeringsfunktion. Kombinerer GROUP BY
med SELECT *
er begrænset til (for det meste) MySQL. Du kan ikke vælge vilkårlige kolonner i dette tilfælde i ASNI SQL.
En variant af mulighed 1
SELECT DISTINCT category FROM content ORDER BY category
foreach
SELECT * FROM content WHERE category=$cat['category']
Dette er den korrigerede version med DISTINCT
i stedet for GROUP BY
.
Den mangler stadig indlejrede forespørgselsopkald. For 5 overordnede kategorier fører dette til 5 forespørgsler i løkken. For 10 overordnede kategorier er der allerede 10 forespørgsler inde. Man bør undgå denne form for dyrkning generelt.
Mulighed 3
SELECT * FROM content ORDER BY category, menu_name
kan bruges med koden ovenfor.
Dette er at foretrække frem for de andre viste muligheder af forskellige årsager:
- Du behøver kun én enkelt databaseforespørgsel for at samle alle data på én gang. Databasen bruger (på lette forespørgsler) det meste af sin tid på at parse den leverede SQL-sætning og kun en brøkdel af tiden til rent faktisk at indsamle de data, du anmodede om. Hvis du giver masser af SQL-kode, skal den bruge meget tid på at analysere den. Hvis du angiver mindre kode, har det mindre at gøre.
- Det er nemmere for en database at hente dataene én gang, sortere dem én gang og returnere dem én gang, i stedet for at samle en del, sortere en del, returnere en del og starte forfra.
stadig uangivet mulighed 4
Der findes en hidtil uudtalt yderligere løsning. Man kan bruge forberedte sætninger, forberede SQL'en en gang og køre det med forskellige id'er. Dette ville stadig forespørge alle kategorier inde i løkken, men ville undgå nødvendigheden af at parse SQL-kode hver gang.
Jeg ved faktisk ikke, om dette er bedre eller værre (eller noget imellem) end min løsning.