Eu usaria
ORDER BY category
em vez de. Você pode então iterar o conjunto de resultados como $old = null;
foreach ($st as $s) {
if $old != $s['id']
echo 'Main category';
$old = $s['id'];
echo 'subcategory'
Atualizar
Existem três soluções possíveis até agora neste tópico para o problema em si.
Opção original 1
SELECT * FROM content group by category
foreach
SELECT * FROM content WHERE category=$cat['category']
Se alguém quiser obter cada categoria pai apenas uma vez, deve usar
DISTINCT
em vez de. Não se deve usar GROUP BY
sem usar nenhuma função de agregação. Combinando GROUP BY
com SELECT *
é limitado (principalmente) ao MySQL. Você não pode selecionar colunas arbitrárias neste caso em ASNI SQL. Uma variante da opção 1
SELECT DISTINCT category FROM content ORDER BY category
foreach
SELECT * FROM content WHERE category=$cat['category']
Esta é a versão corrigida com
DISTINCT
em vez de GROUP BY
. Ainda faltam chamadas de consulta aninhadas. Para 5 categorias pai, isso leva a 5 consultas no loop. Para 10 categorias principais, já existem 10 consultas. Deve-se evitar esse tipo de crescimento em geral.
Opção 3
SELECT * FROM content ORDER BY category, menu_name
utilizável com o código acima.
Isso é preferível às outras opções mostradas devido a diferentes razões:
- Você só precisa de uma única consulta de banco de dados para reunir todos os dados de uma vez. O banco de dados gasta (em consultas fáceis) a maior parte do tempo analisando a instrução SQL fornecida e apenas uma fração do tempo para coletar os dados solicitados. Se você fornecer muito código SQL, ele terá que gastar muito tempo analisando-o. Se você fornecer menos código, terá menos a ver.
- É mais fácil para um banco de dados obter os dados uma vez, classificá-los uma vez e devolvê-los a você uma vez, em vez de coletar uma parte, classificar uma parte, devolver uma parte e começar tudo de novo.
opção 4 ainda não declarada
Existe uma solução adicional até agora não declarada. Pode-se usar instruções preparadas, preparar o SQL uma vez e execute-o com diferentes ids. Isso ainda consultaria todas as categorias dentro do loop, mas evitaria a necessidade de analisar o código SQL sempre.
Na verdade eu não sei se isso é melhor ou pior (ou algo no meio) do que a minha solução.