sql >> Databáze >  >> RDS >> Mysql

Seskupte výsledky mysql podle kategorie a zobrazte je do skupin pod každou kategorií

Použil bych ORDER BY category namísto. Potom můžete iterovat sadu výsledků jako

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

Aktualizovat

V tomto vláknu až dosud existují tři možná řešení samotného problému.

Původní možnost 1

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

Pokud chcete získat každou nadřazenou kategorii pouze jednou, měli byste použít DISTINCT namísto. Neměli byste používat GROUP BY bez použití jakékoli agregační funkce. Kombinace GROUP BY pomocí SELECT * je omezena na (většinou) MySQL. V tomto případě v ASNI SQL nemůžete vybrat libovolné sloupce.

Varianta možnosti 1

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

Toto je opravená verze s DISTINCT místo GROUP BY .

Stále postrádá vnořená volání dotazů. Pro 5 nadřazených kategorií to vede k 5 dotazům ve smyčce. Pro 10 nadřazených kategorií je uvnitř již 10 dotazů. Člověk by se měl tomuto druhu pěstování obecně vyhýbat.

Možnost 3

SELECT * FROM content ORDER BY category, menu_name

použitelné s výše uvedeným kódem.

Toto je z různých důvodů vhodnější než ostatní zobrazené možnosti:

  • Abyste shromáždili všechna data najednou, potřebujete pouze jeden jediný databázový dotaz. Databáze stráví (snadnými dotazy) většinu času analýzou zadaného příkazu SQL a pouze zlomek času skutečně shromáždí požadovaná data. Pokud poskytujete mnoho kódu SQL, musí strávit spoustu času jeho analýzou. Pokud zadáte méně kódu, bude mít méně úkolů.
  • Pro databázi je snazší získat data jednou, jednou je seřadit a jednou vám je vrátit, namísto shromažďování části, třídění části, vrácení části a začít znovu.

stále neuvedená možnost 4

Existuje dosud neuvedené další řešení. Lze použít připravené příkazy, připravit SQL jednou a spusťte jej s různými ID. To by se stále dotazovalo na všechny kategorie uvnitř smyčky, ale zabránilo by se nutnosti pokaždé analyzovat kód SQL.

Vlastně nevím, jestli je to lepší nebo horší (nebo něco mezi tím) než moje řešení.



  1. Escape znak v SQL Server

  2. Jak počítat dny kromě neděle mezi dvěma daty v Postgres?

  3. Najděte řádky s duplicitními/podobnými hodnotami sloupců MySQL

  4. Dynamický dotaz s proměnným počtem IN (p1, p2, p3) argumentů