[MySQL] Nach Gruppen sortieren

pat-b

Aktives Mitglied
Hallo

Ich habe eine Tabelle mit der Spalte "titel", welche mehrere gleiche Einträge hat. Nun möchte ich nach dieser gruppieren und nach der Anzahl gleicher Einträge sortieren.

Beispiel der Spalte:
  • auto
  • hund
  • katze
  • hund
  • katze
  • hund
Wie muss die MySQL-Abfrage aussehen, damit die Ausgabe so aussieht:
  • hund (3)
  • katze (2)
  • auto (1)
Vielen Dank schonmal für die Hilfe!
Patrick
 
"group by" lautet der Filter zum gruppieren.

SQL SELECT id, kuenstler FROM alben GROUP BY kuenstler;



Und um die Anzahl noch anzuzeigen müsste die Abfrage so lauten:


SQL SELECT id, kuenster, COUNT(kuenstler) AS anzahl FROM alben GROUP BY kuenstler;




MfG Sascha Ahlers
 
QUOTE (Sascha Ahlers @ Mi 8.11.2006, 19:18)Und um die Anzahl noch anzuzeigen müsste die Abfrage so lauten:


SQL SELECT id, kuenster, COUNT(kuenstler) AS anzahl FROM alben GROUP BY kuenstler;


Mach das mal und stell dann die Fehlermeldung rein. Dann kann ich das endlich mal in meinem Abschnitt über Group By ergänzen.

Bei Access würde eine Fehlermeldung kommen: "Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'id' nicht als Teil der Aggregatfunktion einschließt".

Sprich: Die Spalte id muß hier komplett raus. Wird über sie gruppiert, wäre das unsinnig, da das wohl der Primärschlüssel ist, also werden alle Zeilen zurückgegeben, Group By bleibt wirkungslos.

Abgesehen davon sind die Tabellen wohl nicht normalisiert - die 'Titel' sollte vom Typ Integer sein und eine Verknüpfung auf eine Randtabelle mit den eigentlichen Texten enthalten.
 
QUOTE (jAuer @ Mi 8.11.2006, 20:35) Mach das mal und stell dann die Fehlermeldung rein. Dann kann ich das endlich mal in meinem Abschnitt über Group By ergänzen.
[...]


CODE mysql> select cat_id, cat_parent, COUNT(cat_parent) AS anzahl FROM link__cat GROUP BY cat_parent;
+--------+------------+--------+
| cat_id | cat_parent | anzahl |
+--------+------------+--------+
|      1 |          0 |      6 |
|      7 |          1 |      1 |
+--------+------------+--------+
2 rows in set (0.00 sec)


Klappt doch.

Gut man bekommt nur immer die ID des ersten gefundenen Eintrages und daraus können sich Logikfehler erschließen, aber im Prinzip funktioniert es. Von einer Fehlermeldung keine Spur.
 
QUOTE (Sascha Ahlers @ Mi 8.11.2006, 19:50)Klappt doch.

Gut man bekommt nur immer die ID des ersten gefundenen Eintrages und daraus können sich Logikfehler erschließen, aber im Prinzip funktioniert es. Von einer Fehlermeldung keine Spur.

Oh! Das ist aber eine - negative - Überraschung.

Sowohl Access als auch der MS-SqlServer reagieren in so einem Fall sofort mit einer blockierenden Fehlermeldung, der Code wird bei der Analyse abgelehnt. Und ich vermute, daß das auch dem SQL-92-Standard entspricht.

Bei Group By muß jede Ausgabespalte entweder im Group-By-Abschnitt drin sein oder sie muß als Argument einer Aggregatfunktion weiterverarbeitet werden. Da das bei der obigen Spalte nicht der Fall ist, würde der Code so nicht funktionieren.

Und da der Wert dieser Spalte wohl nicht deterministisch ist, wäre so etwas auch keine gute Lösung.

@Irene: Was meint Oracle da?
 
QUOTE (jAuer @ Mi 8.11.2006, 21:02)@Irene: Was meint Oracle da?

Oracle meint: ORA-00979: not a GROUP BY expression.

(SQL war select empno, ename, count(deptno) from emp group by deptno wobei EMP eine Tabelle von Mitarbeitern ist und DEPTNO die ID der Abteilung).

Also genau das Verhalten, was auch Access und SQL Server zeigen. By MySQL können ja verschiedene Datenbank-Arten verwendet werden, soweit ich weiss. Eventuell handhaben das nicht alle diese Datenbank-Arten gleich?

Im übrigen müsste man, um solche SQL-Fragen richtig zu beantworten, die komplette Struktur der betreffenden Tabelle(n) inklusive der Primär- und Fremdschlüsselfelder kennen. Wer nur Feldnamen sieht, macht sich im Kopf ein Bild dieser Tabelle, so wie er diese Felder interpretiert, und das ist meistens nicht ganz richtig. Genauso "nicht ganz richtig" ist dann das SQL, was daraus resultiert ;-)

Im Falle von pat-b würde ich das SQL so formulieren:


CODE select titel, count(titel) as anzahl from tabelle_mit_der_spalte_titel group by titel order by anzahl desc

Griessli
Irene
 
QUOTE (Irene @ Do 9.11.2006, 6:46) [...]
Also genau das Verhalten, was auch Access und SQL Server zeigen. By MySQL können ja verschiedene Datenbank-Arten verwendet werden, soweit ich weiss. Eventuell handhaben das nicht alle diese Datenbank-Arten gleich?
[...]

Kann sein, ich habe das auf eine MyISAM Tabelle angewandt, bei InnoDB könnte das ggf. anders aussehen.



PS: Man sollte jedoch vermeiden ein COUNT() auf eine InnoDB Tabelle anzuwenden...
 
Zurück
Oben