Rouven: SELECT mit JOIN und LIMIT GROUP BY Problem

Beitrag lesen

Hello,

Leider versteh ich das nicht.

dann lass mich dir ein Beispiel bauen:
Tabelle
a | b | c
x | y | 1
x | z | 2
m | n | 3
m | o | 4

Erläutere mir das Ergebnis von:
SELECT a, b, c FROM tabelle GROUP BY a

  1. wir wissen, es wird die Gruppen x und m geben. Aber woher wollen wir wissen, welche Werte für b und c ausgewählt werden. Die ersten? Die letzten? Die größten? ... Es gibt _eigentlich_ keine Logik (gem. SQL-Standard), allerdings erlaubt MySQL dir die Abfrage und liefer - ich müsste es nachgucken welchen - verlässlich eine der Kandidatenzeilen.
    Wenn du aber sauber arbeiten willst, dann bleibt dir nur übrig der Datenbank die Bildungsvorschrift vorzugeben.

Folgende Abfrage ist legal:
SELECT a, SUM(c) FROM tabelle GROUP BY a
Warum legal? Nach a wird gruppiert, für c haben wir eine Bildungsvorschrift angegeben, die auf alle Elemente der Gruppe angewendet werden kann (soll heißen: die Zeilen als solche spielen keine Rolle). Das Ergebnis
x | 3
m | 7

Folgende ist ebenfalls legal
SELECT a, MIN(c) FROM tabelle GROUP BY a
Wiederum haben wir eine Bildungsvorschrift, wir sagen ihm, welches der Elemente pro Gruppe (für x 1 oder 2, für m 3 oder 4) wir verwenden wollen, nämlich das Kleinste:
x | 1
m | 3

Die Spalte y kriegen wir nicht ohne weiteres mit hinein. Um in Bezug auf die selektierten Spalten legales SQL zu schreiben bleiben z.B. folgende Möglichkeiten:

  1. mit gruppieren
    SELECT a, b, SUM(c) FROM tabelle GROUP BY a, b
    -> liefert allerdings nicht das gewünschte Ergebnis. Wir gruppieren jetzt plötzlich Zeilen, die bei a UND b den selben Wert haben - Ergebnis:
    x | y | 1
    x | z | 2
    m | n | 3
    m | o | 4

  2. Aggregationsfunktion
    Analog obigem SUM/MIN/... für die Zeichendaten, bietet MySQL z.B. die Möglichkeit alle Strings aneinanderzufügen:
    SELECT a, GROUP_CONCAT(b), SUM(c) FROM tabelle GROUP BY a
    Ergebnis:
    x | y,z | 3
    m | n,o | 7

Daher nochmal mein Ausgangspunkt: du darfst nur Spalten selektieren, bei denen eindeutig geklärt ist, wie der Wert aussieht. Für deine Rechnungen, sofern der Datenstand konsistent ist, gebe ich folgende Abwandlung von oben zu bedenken:
Tabelle
a | b | c
x | y | 1
x | y | 2
m | n | 3
m | n | 4
SELECT a, b, SUM(c) FROM tabelle GROUP BY a, b
Da hier die Werte für alle Mitglieder der Gruppen x und m identisch ist, lautet das Ergebnis:
x | y | 3
m | n | 7

MfG
Rouven

--
-------------------
sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
Vegetarier essen meinem Essen das Essen weg.