MySQL Limit auf ein bestimmtes Feld
matts1
- datenbank
0 Alex0 matts1
1 Vinzenz Mai
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
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 1Mit 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
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
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
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