Yo usaría ORDER BY category
en cambio. Luego puede iterar el conjunto de resultados como
$old = null;
foreach ($st as $s) {
if $old != $s['id']
echo 'Main category';
$old = $s['id'];
echo 'subcategory'
Actualizar
Existen tres posibles soluciones hasta ahora en este hilo para el problema en sí.
Opción original 1
SELECT * FROM content group by category
foreach
SELECT * FROM content WHERE category=$cat['category']
Si solo desea obtener cada categoría principal una vez, debe usar DISTINCT
en cambio. Uno no debe usar GROUP BY
sin utilizar ninguna función de agregación. Combinando GROUP BY
con SELECT *
se limita a (principalmente) MySQL. No puede seleccionar columnas arbitrarias en este caso en ASNI SQL.
Una variante de la opción 1
SELECT DISTINCT category FROM content ORDER BY category
foreach
SELECT * FROM content WHERE category=$cat['category']
Esta es la versión corregida con DISTINCT
en lugar de GROUP BY
.
Todavía carece de llamadas de consulta anidadas. Para 5 categorías principales, esto genera 5 consultas en el bucle. Para 10 categorías principales, ya hay 10 consultas dentro. En general, se debe evitar este tipo de cultivo.
Opción 3
SELECT * FROM content ORDER BY category, menu_name
utilizable con el código anterior.
Esto es preferible a las otras opciones mostradas por diferentes razones:
- Solo necesita una única consulta de base de datos para recopilar todos los datos a la vez. La base de datos pasa (en consultas sencillas) la mayor parte de su tiempo analizando la instrucción SQL proporcionada y solo una fracción de tiempo para recopilar los datos que solicitó. Si proporciona mucho código SQL, tiene que pasar mucho tiempo analizándolo. Si proporciona menos código, tiene menos trabajo.
- Es más fácil para una base de datos obtener los datos una vez, clasificarlos una vez y devolverlos una vez, en lugar de recopilar una parte, clasificar una parte, devolver una parte y empezar de nuevo.
opción 4 todavía sin especificar
Existe una solución adicional hasta ahora no declarada. Se pueden usar sentencias preparadas, preparar el SQL una vez y ejecutarlo con diferentes ID. Esto seguiría consultando todas las categorías dentro del bucle, pero evitaría la necesidad de analizar el código SQL cada vez.
En realidad, no sé si esto es mejor o peor (o algo intermedio) que mi solución.