Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Agrupe os resultados do mysql por categoria e exiba-os em grupos em cada categoria


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.