Mysql
 sql >> Database >  >> RDS >> Mysql

Raggruppa i risultati di MySQL per categoria e visualizzali in gruppi in ciascuna categoria

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.