Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gruppieren Sie mysql-Ergebnisse nach Kategorie und zeigen Sie sie in Gruppen unter jeder Kategorie an

Ich würde ORDER BY category verwenden stattdessen. Sie können die Ergebnismenge dann iterieren wie

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

Aktualisieren

Bisher gibt es in diesem Thread drei mögliche Lösungen für das Problem selbst.

Originaloption 1

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

Wenn man jede übergeordnete Kategorie nur einmal erhalten möchte, sollte man DISTINCT verwenden stattdessen. Man sollte GROUP BY nicht verwenden ohne Verwendung einer Aggregationsfunktion. Kombinieren von GROUP BY mit SELECT * ist (meistens) auf MySQL beschränkt. In ASNI SQL können Sie in diesem Fall keine beliebigen Spalten auswählen.

Eine Variante von Option 1

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

Dies ist die korrigierte Version mit DISTINCT statt GROUP BY .

Es fehlen noch verschachtelte Abfrageaufrufe. Bei 5 übergeordneten Kategorien führt dies zu 5 Abfragen in der Schleife. Für 10 übergeordnete Kategorien gibt es bereits 10 Abfragen darin. Diese Art des Anbaus sollte man generell vermeiden.

Möglichkeit 3

SELECT * FROM content ORDER BY category, menu_name

verwendbar mit obigem Code.

Dies ist aus verschiedenen Gründen den anderen angezeigten Optionen vorzuziehen:

  • Sie brauchen nur eine einzige Datenbankabfrage, um alle Daten auf einmal zu sammeln. Die Datenbank verbringt (bei einfachen Abfragen) die meiste Zeit damit, die bereitgestellte SQL-Anweisung zu analysieren, und nur einen Bruchteil der Zeit, um die angeforderten Daten tatsächlich zu sammeln. Wenn Sie viel SQL-Code bereitstellen, muss viel Zeit damit verbracht werden, ihn zu analysieren. Wenn Sie weniger Code bereitstellen, hat es weniger zu tun.
  • Es ist einfacher für eine Datenbank, die Daten einmal zu erhalten, einmal zu sortieren und einmal an Sie zurückzugeben, anstatt einen Teil zu sammeln, einen Teil zu sortieren, einen Teil zurückzugeben und von vorne zu beginnen.

noch nicht genannte Option 4

Es existiert eine bisher nicht genannte weitere Lösung. Man kann vorbereitete Anweisungen verwenden, die SQL einmal vorbereiten und führen Sie es mit verschiedenen IDs aus. Dies würde immer noch alle Kategorien innerhalb der Schleife abfragen, aber die Notwendigkeit vermeiden, jedes Mal SQL-Code zu parsen.

Eigentlich weiß ich nicht, ob das besser oder schlechter (oder etwas dazwischen) ist als meine Lösung.