sql >> Databasteknik >  >> RDS >> Mysql

Gruppera mysql-resultat efter kategori och visa dem i grupper under varje kategori

Jag skulle använda ORDER BY category istället. Du kan sedan upprepa resultatuppsättningen som

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

Uppdatera

Det finns tre möjliga lösningar hittills i denna tråd på själva problemet.

Originalalternativ 1

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

Om man bara vill få varje föräldrakategori en gång, bör man använda DISTINCT istället. Man bör inte använda GROUP BY utan att använda någon aggregeringsfunktion. Kombinera GROUP BY med SELECT * är begränsad till (för det mesta) MySQL. Du kan inte välja godtyckliga kolumner i det här fallet i ASNI SQL.

En variant av alternativ 1

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

Detta är den korrigerade versionen med DISTINCT istället för GROUP BY .

Det saknas fortfarande kapslade frågeanrop. För 5 överordnade kategorier leder detta till 5 frågor i slingan. För 10 överordnade kategorier finns det redan 10 frågor inuti. Man bör undvika denna typ av odling i allmänhet.

Alternativ 3

SELECT * FROM content ORDER BY category, menu_name

kan användas med koden ovan.

Detta är att föredra framför de andra alternativen som visas på grund av olika anledningar:

  • Du behöver bara en enda databasfråga för att samla in all data på en gång. Databasen tillbringar (på enkla frågor) det mesta av sin tid på att analysera den SQL-sats som tillhandahålls och bara en bråkdel av tiden för att faktiskt samla in de data du begärde. Om du tillhandahåller mycket SQL-kod måste den lägga mycket tid på att analysera den. Om du anger mindre kod har det mindre att göra.
  • Det är lättare för en databas att hämta data en gång, sortera den en gång och returnera den till dig en gång, istället för att samla en del, sortera en del, returnera en del och börja om från början.

fortfarande outtalat alternativ 4

Det finns en hittills outtalad ytterligare lösning. Man kan använda förberedda satser, förbered SQL en gång och kör den med olika ID. Detta skulle fortfarande fråga alla kategorier i slingan, men skulle undvika behovet av att analysera SQL-kod varje gång.

Jag vet faktiskt inte om det här är bättre eller sämre (eller något däremellan) än min lösning.



  1. Synkronisera 2 tabeller av olika databaser - MySQL

  2. fråga inte lika fungerar inte

  3. hur man kontrollerar och ställer in max_allowed_packet mysql-variabel

  4. Stora objekt får inte användas i auto-commit-läge