matts1: MySQL Limit auf ein bestimmtes Feld

Hallo zusammen,

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

Wenn ich jetzt nur 20 Einträge erhalten möchte, jedoch ein Limit setze, ist dieses ja nicht korrekt, da mir nur 20 Zeilen zurückgeliefert werden. Ich benötige aber 20 Zeilen als DISTINCT auf Spalte ID.

Wie ist soetwas möglich?

Viele Grüße
matts1

  1. Hallo,

    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

    Vielleicht solltest du mal genau beschreiben, wie du von der ersten zur zweiten Ergebnismenge kommst - ich verstehe das zumindest nicht ganz.

    Wieso hast du mehrmals die gleiche ID in einer Tabelle? Eine ID ist zum eindeutigen Identifizieren da. Oder ist das der Verweis auf eine andere Tabelle und auf die dortigen eindeutigen IDs? oder Setzt sich deine ID aus mehreren Spalten zusammen? Dann wäre wohl nur der Name ID etwas unglücklich gewählt...

    Gruß
    Alex

    1. Vielleicht solltest du mal genau beschreiben, wie du von der ersten zur zweiten Ergebnismenge kommst - ich verstehe das zumindest nicht ganz.

      Das mache ich in einer Schleife in PHP :)

      Wieso hast du mehrmals die gleiche ID in einer Tabelle? Eine ID ist zum eindeutigen Identifizieren da. Oder ist das der Verweis auf eine andere Tabelle und auf die dortigen eindeutigen IDs? oder Setzt sich deine ID aus mehreren Spalten zusammen? Dann wäre wohl nur der Name ID etwas unglücklich gewählt...

      Eine ID kommt nur einmal in der Datenbank vor, keine Sorge.
      Es kann nur vorkommen dass es mehrere Zuschläge (=1) von unterschiedlichen Namen gibt.

      Ich fürchte ich muss die Anfrage etwas umgestalten. Subquerys sind nur extrem langsam.

      LG

      1. Hallo,

        Ich fürchte ich muss die Anfrage etwas umgestalten. Subquerys sind nur extrem langsam.

        dann solltest Du dafür sorgen, das Indexe genutzt werden können.

        Freundliche Grüße

        Vinzenz

  2. 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