Userei ORDER BY category
invece. Puoi quindi ripetere il set di risultati come
$old = null;
foreach ($st as $s) {
if $old != $s['id']
echo 'Main category';
$old = $s['id'];
echo 'subcategory'
Aggiorna
Esistono tre possibili soluzioni fino ad ora in questo thread al problema stesso.
Opzione originale 1
SELECT * FROM content group by category
foreach
SELECT * FROM content WHERE category=$cat['category']
Se si desidera ottenere ciascuna categoria padre solo una volta, è necessario utilizzare DISTINCT
invece. Non si dovrebbe usare GROUP BY
senza utilizzare alcuna funzione di aggregazione. Combinando GROUP BY
con SELECT *
è limitato a (principalmente) MySQL. Non è possibile selezionare colonne arbitrarie in questo caso in ASNI SQL.
Una variante dell'opzione 1
SELECT DISTINCT category FROM content ORDER BY category
foreach
SELECT * FROM content WHERE category=$cat['category']
Questa è la versione corretta con DISTINCT
invece di GROUP BY
.
Manca ancora di chiamate di query nidificate. Per 5 categorie principali, questo porta a 5 query nel ciclo. Per 10 categorie principali, ci sono già 10 query all'interno. Si dovrebbe evitare questo tipo di crescita in generale.
Opzione 3
SELECT * FROM content ORDER BY category, menu_name
utilizzabile con il codice sopra.
Questo è preferibile alle altre opzioni mostrate per diversi motivi:
- Hai bisogno di una sola query di database per raccogliere tutti i dati in una volta. Il database trascorre (su query facili) la maggior parte del suo tempo ad analizzare l'istruzione SQL fornita e solo una frazione del tempo per raccogliere effettivamente i dati richiesti. Se fornisci molto codice SQL, deve dedicare molto tempo all'analisi. Se fornisci meno codice, ha meno da fare.
- È più facile per un database ottenere i dati una volta, ordinarli una volta e restituirli una volta, invece di raccogliere una parte, ordinare una parte, restituire una parte e ricominciare da capo.
opzione 4 ancora non dichiarata
Esiste un'ulteriore soluzione fino ad ora non dichiarata. Si possono usare istruzioni preparate, preparare l'SQL una volta ed eseguilo con ID diversi. Ciò interrogherebbe comunque tutte le categorie all'interno del ciclo, ma eviterebbe la necessità di analizzare il codice SQL ogni volta.
In realtà non so se questo sia meglio o peggio (o qc nel mezzo) della mia soluzione.