Ik zou ORDER BY category
gebruiken in plaats van. U kunt dan de resultatenset herhalen zoals
$old = null;
foreach ($st as $s) {
if $old != $s['id']
echo 'Main category';
$old = $s['id'];
echo 'subcategory'
Bijwerken
Er bestaan tot nu toe drie mogelijke oplossingen in deze thread voor het probleem zelf.
Originele optie 1
SELECT * FROM content group by category
foreach
SELECT * FROM content WHERE category=$cat['category']
Als je elke bovenliggende categorie maar één keer wilt krijgen, moet je DISTINCT
. gebruiken in plaats van. Men mag GROUP BY
niet gebruiken zonder een aggregatiefunctie te gebruiken. Combineren van GROUP BY
met SELECT *
is beperkt tot (meestal) MySQL. U kunt in dit geval geen willekeurige kolommen selecteren in ASNI SQL.
Een variant van optie 1
SELECT DISTINCT category FROM content ORDER BY category
foreach
SELECT * FROM content WHERE category=$cat['category']
Dit is de gecorrigeerde versie met DISTINCT
in plaats van GROUP BY
.
Het ontbreekt nog steeds aan geneste query-aanroepen. Voor 5 bovenliggende categorieën leidt dit tot 5 zoekopdrachten in de lus. Voor 10 bovenliggende categorieën zijn er al 10 zoekopdrachten binnen. Men moet dit soort teelt in het algemeen vermijden.
Optie 3
SELECT * FROM content ORDER BY category, menu_name
bruikbaar met de bovenstaande code.
Dit heeft om verschillende redenen de voorkeur boven de andere getoonde opties:
- Je hebt maar één databasequery nodig om alle gegevens tegelijk te verzamelen. De database besteedt (aan eenvoudige zoekopdrachten) het grootste deel van zijn tijd aan het ontleden van de verstrekte SQL-instructie en slechts een fractie van de tijd om de gevraagde gegevens daadwerkelijk te verzamelen. Als u veel SQL-code aanlevert, moet het veel tijd besteden aan het ontleden ervan. Als je minder code opgeeft, hoeft het minder te doen.
- Het is gemakkelijker voor een database om de gegevens één keer op te halen, één keer te sorteren en één keer terug te sturen, in plaats van een deel te verzamelen, een deel te sorteren, een deel terug te geven en helemaal opnieuw te beginnen.
nog niet aangegeven optie 4
Er bestaat een tot nu toe onuitgesproken verdere oplossing. Men kan voorbereide instructies gebruiken, de SQL eenmaal prepare voorbereiden en voer het uit met verschillende id's. Dit zou nog steeds alle categorieën binnen de lus bevragen, maar zou de noodzaak vermijden om elke keer SQL-code te ontleden.
Eigenlijk weet ik niet of dit beter of slechter is (of iets ertussenin) dan mijn oplossing.