Jag skulle använda ORDER BY category
istället. Du kan sedan upprepa resultatuppsättningen som
$old = null;
foreach ($st as $s) {
if $old != $s['id']
echo 'Main category';
$old = $s['id'];
echo 'subcategory'
Uppdatera
Det finns tre möjliga lösningar hittills i denna tråd på själva problemet.
Originalalternativ 1
SELECT * FROM content group by category
foreach
SELECT * FROM content WHERE category=$cat['category']
Om man bara vill få varje föräldrakategori en gång, bör man använda DISTINCT
istället. Man bör inte använda GROUP BY
utan att använda någon aggregeringsfunktion. Kombinera GROUP BY
med SELECT *
är begränsad till (för det mesta) MySQL. Du kan inte välja godtyckliga kolumner i det här fallet i ASNI SQL.
En variant av alternativ 1
SELECT DISTINCT category FROM content ORDER BY category
foreach
SELECT * FROM content WHERE category=$cat['category']
Detta är den korrigerade versionen med DISTINCT
istället för GROUP BY
.
Det saknas fortfarande kapslade frågeanrop. För 5 överordnade kategorier leder detta till 5 frågor i slingan. För 10 överordnade kategorier finns det redan 10 frågor inuti. Man bör undvika denna typ av odling i allmänhet.
Alternativ 3
SELECT * FROM content ORDER BY category, menu_name
kan användas med koden ovan.
Detta är att föredra framför de andra alternativen som visas på grund av olika anledningar:
- Du behöver bara en enda databasfråga för att samla in all data på en gång. Databasen tillbringar (på enkla frågor) det mesta av sin tid på att analysera den SQL-sats som tillhandahålls och bara en bråkdel av tiden för att faktiskt samla in de data du begärde. Om du tillhandahåller mycket SQL-kod måste den lägga mycket tid på att analysera den. Om du anger mindre kod har det mindre att göra.
- Det är lättare för en databas att hämta data en gång, sortera den en gång och returnera den till dig en gång, istället för att samla en del, sortera en del, returnera en del och börja om från början.
fortfarande outtalat alternativ 4
Det finns en hittills outtalad ytterligare lösning. Man kan använda förberedda satser, förbered SQL en gång och kör den med olika ID. Detta skulle fortfarande fråga alla kategorier i slingan, men skulle undvika behovet av att analysera SQL-kod varje gång.
Jag vet faktiskt inte om det här är bättre eller sämre (eller något däremellan) än min lösning.