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

Gruppér mysql-resultater efter kategori og vis dem i grupper under hver kategori

Jeg ville bruge ORDER BY category i stedet. Du kan derefter gentage resultatsættet som

$old = null;
foreach ($st as $s) {
  if $old != $s['id']
    echo 'Main category';
    $old = $s['id'];
  echo 'subcategory'

Opdater

Der findes tre mulige løsninger indtil nu i denne tråd på selve problemet.

Original mulighed 1

SELECT * FROM content group by category
foreach
  SELECT * FROM content WHERE category=$cat['category']

Hvis man kun ønsker at få hver overordnet kategori én gang, skal man bruge DISTINCT i stedet. Man bør ikke bruge GROUP BY uden at bruge nogen aggregeringsfunktion. Kombinerer GROUP BY med SELECT * er begrænset til (for det meste) MySQL. Du kan ikke vælge vilkårlige kolonner i dette tilfælde i ASNI SQL.

En variant af mulighed 1

SELECT DISTINCT category FROM content ORDER BY category
foreach
  SELECT * FROM content WHERE category=$cat['category']

Dette er den korrigerede version med DISTINCT i stedet for GROUP BY .

Den mangler stadig indlejrede forespørgselsopkald. For 5 overordnede kategorier fører dette til 5 forespørgsler i løkken. For 10 overordnede kategorier er der allerede 10 forespørgsler inde. Man bør undgå denne form for dyrkning generelt.

Mulighed 3

SELECT * FROM content ORDER BY category, menu_name

kan bruges med koden ovenfor.

Dette er at foretrække frem for de andre viste muligheder af forskellige årsager:

  • Du behøver kun én enkelt databaseforespørgsel for at samle alle data på én gang. Databasen bruger (på lette forespørgsler) det meste af sin tid på at parse den leverede SQL-sætning og kun en brøkdel af tiden til rent faktisk at indsamle de data, du anmodede om. Hvis du giver masser af SQL-kode, skal den bruge meget tid på at analysere den. Hvis du angiver mindre kode, har det mindre at gøre.
  • Det er nemmere for en database at hente dataene én gang, sortere dem én gang og returnere dem én gang, i stedet for at samle en del, sortere en del, returnere en del og starte forfra.

stadig uangivet mulighed 4

Der findes en hidtil uudtalt yderligere løsning. Man kan bruge forberedte sætninger, forberede SQL'en en gang og køre det med forskellige id'er. Dette ville stadig forespørge alle kategorier inde i løkken, men ville undgå nødvendigheden af ​​at parse SQL-kode hver gang.

Jeg ved faktisk ikke, om dette er bedre eller værre (eller noget imellem) end min løsning.



  1. Ydeevnemyter:Tabelvariabler er altid i hukommelsen

  2. Gruppér efter med union mysql select-forespørgsel

  3. Hvordan laver man en 'korrekt sag'-formatering af en mysql-kolonne?

  4. PGError:FEJL:tilladelse nægtet til relation (når du bruger Heroku)