J'utiliserais la catégorie ORDER BY category
Au lieu. Vous pouvez ensuite itérer le jeu de résultats comme
$old = null;
foreach ($st as $s) {
if $old != $s['id']
echo 'Main category';
$old = $s['id'];
echo 'subcategory'
Mettre à jour
Il existe jusqu'à présent trois solutions possibles dans ce fil au problème lui-même.
Option d'origine 1
SELECT * FROM content group by category
foreach
SELECT * FROM content WHERE category=$cat['category']
Si l'on ne veut obtenir chaque catégorie parente qu'une seule fois, il faut utiliser DISTINCT
Au lieu. Il ne faut pas utiliser GROUP BY
sans utiliser de fonction d'agrégation. Combinaison de GROUP BY
avec SELECT *
est limité à (principalement) MySQL. Vous ne pouvez pas sélectionner des colonnes arbitraires dans ce cas dans ASNI SQL.
Une variante de l'option 1
SELECT DISTINCT category FROM content ORDER BY category
foreach
SELECT * FROM content WHERE category=$cat['category']
Ceci est la version corrigée avec DISTINCT
au lieu de GROUP BY
.
Il manque toujours des appels de requête imbriqués. Pour 5 catégories parentes, cela conduit à 5 requêtes dans la boucle. Pour 10 catégories parentes, il y a déjà 10 requêtes à l'intérieur. Il faut éviter ce genre de culture en général.
Option 3
SELECT * FROM content ORDER BY category, menu_name
utilisable avec le code ci-dessus.
Ceci est préférable aux autres options affichées pour différentes raisons :
- Vous n'avez besoin que d'une seule requête de base de données pour collecter toutes les données en même temps. La base de données passe (sur des requêtes faciles) la plupart de son temps à analyser l'instruction SQL fournie et seulement une fraction de temps à rassembler les données que vous avez demandées. Si vous fournissez beaucoup de code SQL, il doit passer beaucoup de temps à l'analyser. Si vous fournissez moins de code, il a moins à faire.
- Il est plus facile pour une base de données d'obtenir les données une fois, de les trier une fois et de vous les renvoyer une fois, au lieu de rassembler une partie, de trier une partie, de renvoyer une partie et de tout recommencer.
option 4 toujours non indiquée
Il existe une autre solution jusqu'à présent non énoncée. On peut utiliser des instructions préparées, préparer le SQL une fois et exécutez-le avec différents identifiants. Cela interrogerait toujours toutes les catégories à l'intérieur de la boucle, mais éviterait la nécessité d'analyser le code SQL à chaque fois.
En fait, je ne sais pas si c'est mieux ou pire (ou qc entre les deux) que ma solution.