Vinzenz Mai: MySQL Limit auf ein bestimmtes Feld

Beitrag lesen

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 1

Mit 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