Hallo,
ich habe eine relativ große Ergebnismenge bei der mehrere IDs aufgrund der Datenbankkonstellation öftere aufgeführt werden.
Die Ergebnismenge schaut wie folgt aus:
ID | Name | Zuschlag
1 Hans 0
1 Gerd 1
2 Matthias 0
3 Jens 1
3 Jürgen 0
3 Paul 1Mit PHP wird diese Abfrage zu folgendem umgeformt:
1 Gerd
2 Matthias
3 Jens, Paul
Wie ist soetwas möglich?
ohne LIMIT, mit korrelierter Unterabfrage.
Du möchtest im ersten Schritt die ID-Werte und Namen haben, die zu ihrer ID den größten Zuschlagswert haben - dazu benötigst Du eine korrelierte Unterabfrage. Diese liefert auch korrekt zur ID 3 zwei Datensätze zurück.
SELECT
ID,
Name
FROM
tabelle t1 -- Aliasname erforderlich, um äußere und
-- innere Abfrage unterscheiden zu könnnen
WHERE
t1.Zuschlag = (
SELECT
MAX(t2.Zuschlag)
FROM
tabelle t2 -- Aliasname für innere Abfrage
WHERE
t1.ID = t2.ID
)
liefert
ID | Name
----------
1 | Gerd
2 | Matthias
3 | Jens
3 | Paul
Auf das Ergebnis dieser Abfrage setzt Du wieder eine Abfrage ab, bei der Du nach der ID gruppierst und auf die Spalte Name die Aggregatsfunktion GROUP_CONCAT() anwendest:
SELECT
a.ID,
a.GROUP_CONCAT(Name, SEPARATOR ', ')
FROM (
SELECT
ID,
Name
FROM
tabelle t1
WHERE
t1.Zuschlag = (
SELECT
MAX(t2.Zuschlag)
FROM
tabelle t2 -- Aliasname für innere Abfrage
WHERE
t1.ID = t2.ID
)
) AS a
liefert das Gewünschte.
Freundliche Grüße
Vinzenz