MYSQL select DISTINCT über mehrere Spalten
Tino
- datenbank
0 Sven Rautenberg0 Tino0 Sven Rautenberg0 Ilja0 Sven Rautenberg0 Ilja0 Sven Rautenberg0 Ilja
hallo
ich habe eine tabelle in der vom user eingetragene werte mit monat und jahr stehen.
diese will ich nun sortiert nach jahr und monat ausgeben.
bisher erfolgte diese ausgabe nur für jeweils ein jahr und ich hatte als abfrage für die spaltenköpfe:
SELECT DISTINCT monat FROM ... ORDER BY monat
nun bräuchte ich aber irgendwas wo für jedes jahr alle vorhandenen monate ausgegeben werden.
funktioniert DISTINCT jahr, monat?
oder muss ich 2 abrfragen für jahr und dann monat verschachteln?
tino
Moin!
nun bräuchte ich aber irgendwas wo für jedes jahr alle vorhandenen monate ausgegeben werden.
funktioniert DISTINCT jahr, monat?
oder muss ich 2 abrfragen für jahr und dann monat verschachteln?
Was hälst du von "GROUP BY"?
- Sven Rautenberg
nun bräuchte ich aber irgendwas wo für jedes jahr alle vorhandenen monate ausgegeben werden.
funktioniert DISTINCT jahr, monat?
oder muss ich 2 abrfragen für jahr und dann monat verschachteln?Was hälst du von "GROUP BY"?
wenn ich GROUP BY richtig verstehe, dann ist das doch eine art sortierung.
ich habe in der tab z.B.
01 2003 a
01 2003 b
02 2003 c
03 2003 d
01 2004 e
02 2004 f
02 2004 g
ich will am ende raus haben:
01 2003
02 2003
03 2003
01 2004
02 2004
GROUP BY habe ich bisher noch nicht verwendet - stehe also etwas auf dem schlauch
Moin!
Was hälst du von "GROUP BY"?
wenn ich GROUP BY richtig verstehe, dann ist das doch eine art sortierung.
Nein. Sortieren tut ORDER BY. GROUP BY gruppiert, fasst nach flexiblen Gesichtspunkten doppelte Zeilen zusammen.
DISTINCT hingegen ist total unflexibel und eliminiert nur identische doppelte Zeilen aus dem Ergebnis. Die beiden Anweisungen scheinen das gleiche zu tun - tun es aber nicht.
Da deine Anforderungen jetzt aber klar sind:
SELECT DISTINCT monat, jahr FROM...
sollte genau das tun, was du willst. DISTINCT bezieht sich nicht auf eine bestimmte Spalte (so nach dem Motto "DISTINCT spalte, Nicht-DISTINCT andere-spalte"), sondern auf die Art des SELECT ("SELECT DISTINCT" im Gegensatz zu "SELECT ALL", was Standard ist).
Wenn du mit "SELECT monat, jahr" Zeilen erhälst, die doppelt vorkommen, wird dir "SELECT DISTINCT monat, jahr" diese Dopplungen eliminieren.
Das funktioniert aber nur solange, wie du wirklich nur Monat und Jahr selektierst. Wenn du noch eine weitere Spalte selektierst, die beispielsweise eine Beschreibung enthält, und bei gleichem Monat und Jahr je einen unterschiedlichen Eintrag enthält, wird DISTINCT keine Dopplung erkennen (die Beschreibung ist unterschiedlich). Da würde dann GROUP BY weiterhelfen können - allerdings müßtest du dann definieren, welche der zwei (oder mehr) möglichen Beschreibungen du als Ergebnis haben willst.
GROUP BY habe ich bisher noch nicht verwendet - stehe also etwas auf dem schlauch
GROUP BY ist ein sehr wichtiges Mittel in SQL, dass einem viele Dinge vereinfachen kann. Du solltest dich mal damit beschäftigen.
Dein Monat/Jahr-Problem ließe sich damit ebenfalls lösen:
SELECT monat, jahr FROM tabelle GROUP BY monat, jahr
Allerdings ist dieser Anwendungsfall blöd, weil eigentlich noch mindestens eine weitere Spalte selektiert werden sollte, damit die Gruppierung Sinn macht - weil DISTINCT ansonsten sinnvoller ist.
- Sven Rautenberg
yo,
Nein. Sortieren tut ORDER BY. GROUP BY gruppiert, fasst nach flexiblen Gesichtspunkten doppelte Zeilen zusammen.
group by fasst auch datensätze zusammen, die nicht identisch sind, sondern bezieht sich nur auf die angegeben spalten, die als eine gruppe aufgefasst werden. insofern würde ich nicht von doppelten zeilen sprechen, obwohl sicherlich das richtige damit gemeint ist.
Das funktioniert aber nur solange, wie du wirklich nur Monat und Jahr selektierst. Wenn du noch eine weitere Spalte selektierst, die beispielsweise eine Beschreibung enthält, und bei gleichem Monat und Jahr je einen unterschiedlichen Eintrag enthält, wird DISTINCT keine Dopplung erkennen (die Beschreibung ist unterschiedlich). Da würde dann GROUP BY weiterhelfen können...
letztlich kann group by nicht viel mehr als das distinct. will man die spalte beschreibung mit reinnehmen, würden genausoviele datensätze rauskommen, wie mit distinct. der vorteil von group by liegt wohl darin, dass man zusätzlich noch aggregat funktionen mit angeben kann, die sich nur auf die gebildeten gruppen beziehen.
Ilja
Moin!
letztlich kann group by nicht viel mehr als das distinct.
Logisch. Beide fassen mehrer Spalten zu einer zusammen. Unterschiedlich ist nur die Art, nach welchen Kriterien.
will man die spalte beschreibung mit reinnehmen, würden genausoviele datensätze rauskommen, wie mit distinct. der vorteil von group by liegt wohl darin, dass man zusätzlich noch aggregat funktionen mit angeben kann, die sich nur auf die gebildeten gruppen beziehen.
Nicht ganz korrekt. Man _muss_ Aggregatfunktionen benutzen (außer für die in GROUP BY gelisteten Ergebnisspalten). MySQL hat in Abweichung von ANSI-SQL ein Feature "hidden columns", welches primär performancefördernd sein soll, und erlaubt, im SELECT auch Spalten aufzuführen, die nicht in GROUP BY stehen und auf die auch keine Aggregatsfunktion angewendet wird - damit man verläßliche Ergebnisse erhält, müssen diese Spalten dann aber bei jeweils allen zusammengefaßten Zeilen denselben Inhalt haben, ansonsten wird nach dem Zufallsprinzip irgendein Inhalt ausgewählt.
- Sven Rautenberg
yo,
Logisch. Beide fassen mehrer Spalten zu einer zusammen. Unterschiedlich ist nur die Art, nach welchen Kriterien.
nicht wirklich, erstens werden nicht mehrere spalten zu einer zusammengefasst. und zweitens bringt group by genau die gleiche ergebnisliste hervor, wie es auch distinct machen würde. das resultat ist letztlich also genau das gleiche, von den aggregatfunktionen abgesehen. und nur darin liegt der unterschied und der sinn von group by.
Nicht ganz korrekt. Man _muss_ Aggregatfunktionen benutzen (außer für die in GROUP BY gelisteten Ergebnisspalten).
bei group by muss man keine aggregatfunktionen benutzen, man will es. würde man es nicht tun, dann könnte man immer auf distinct zurückgreifen. insofern sehe ich nicht, warum es nicht ganz korrekt ist, es sein den du bekommst ergebnislisten mit group by, die man nicht mit distinct hinbekommt, sofern man keine aggregat-funktionen benutzt. und das würde wieder den sinn un der bedeutung von group by deutlich machen, nämlich die aggregat funktionen.
Ilja
Moin!
Logisch. Beide fassen mehrer Spalten zu einer zusammen. Unterschiedlich ist nur die Art, nach welchen Kriterien.
nicht wirklich, erstens werden nicht mehrere spalten zu einer zusammengefasst.
Wenn man ohne GROUP BY oder DISTINCT zwei oder mehr Ergebniszeilen hat, und mit diesen nur eine einzige - was ist das denn anderes als "zusammenfassen"?
und zweitens bringt group by genau die gleiche ergebnisliste hervor, wie es auch distinct machen würde.
Aber nur bei diesem konkreten Beispiel:
SELECT DISTINCT spalte1, spalte2
SELECT spalte1, spalte2 GROUP BY spalte1, spalte2
sind die Ergebnisse identisch.
Wenn du das SELECT änderst, kriegst du Unterschiede:
SELECT DISTINCT spalte1, spalte2, spalte3
ist was anderes als
SELECT spalte1, spalte2, spalte3 GROUP BY spalte1, spalte2
Das letztere funktioniert nur bei MySQL - und da auch nur dann sicher, wenn spalte3 eine 1:1-Werteabhängigkeit von spalte1 oder spalte2 hat.
das resultat ist letztlich also genau das gleiche, von den aggregatfunktionen abgesehen. und nur darin liegt der unterschied und der sinn von group by.
Mit GROUP BY kriegt man überwiegend andere Ergebnisse hin, als mit DISTINCT. Diese beiden Funktionen sind nicht gleich.
Nicht ganz korrekt. Man _muss_ Aggregatfunktionen benutzen (außer für die in GROUP BY gelisteten Ergebnisspalten).
bei group by muss man keine aggregatfunktionen benutzen, man will es.
Du bist MySQL-verseucht. Nimm mal PostgreSQL und probiere das 3-Spalte-GROUP-BY-Statement von oben. Sollte nicht funktionieren.
- Sven Rautenberg
yo,
Wenn man ohne GROUP BY oder DISTINCT zwei oder mehr Ergebniszeilen hat, und mit diesen nur eine einzige - was ist das denn anderes als "zusammenfassen"?
weil du oben von spalten spricht und nun von ergebniszeilen. und zwei spalten werden nicht zu einer zusammengefasst, sondern bleiben zwei spalten.
SELECT spalte1, spalte2, spalte3 GROUP BY spalte1, spalte2
weiter unten wirst du mir mysql unten verseuchtheit vor und hier gibst du es als ein beispiel an. ich glaube, du bringst da jäger und hase durcheinander. diese anweisung würde in aller regel bei den meisten dbms zu fehlermeldungen führen und selbst teilweise in mysql, so wie du ja selbst schreibst. du kannst mit doch keinen vorwurf machen, für etwas, was du als beispiel angegeben hast. ich plediere ja gerade dafür, dass die spalten bei der group by klausel und die spalten bei der dinsinct klausel immer das gleiche ergebnis liefern, wenn sie gleich sind. und um spalten by group by verwenden zu können, müssen sie auch by group by mit angeben sein.
Mit GROUP BY kriegt man überwiegend andere Ergebnisse hin, als mit DISTINCT. Diese beiden Funktionen sind nicht gleich.
dann gebe doch mal ein konkretes bespiel, ohne auf diese mysql sonderregelung. das würde alles verkürzen und wird bräuchten nicht lange nach erklärungen suchen.
Ilja