2013-03-13 14 views
14

Ich habe folgende Tabelle namens Fragen:Wie von DESC-Gruppe bestellt

ID | asker 
1 | Bob 
2 | Bob 
3 | Marley 

Ich möchte nur einmal in jeden Fragesteller wählen, und wenn es mehrere Fragesteller mit dem gleichen Namen, wählen Sie das eine der höchsten ID . Also, die erwarteten Ergebnisse:

ID | asker 
3 | Marley 
2 | Bob 

ich die folgende Abfrage verwenden:

SELECT * FROM questions GROUP by questions.asker ORDER by questions.id DESC 

ich folgendes Ergebnis:

ID | asker 
3 | Marley 
1 | Bob 

So wählt er den ersten 'Bob' es Begegnungen statt von der letzten.

Dank

+0

Frage: Ist Ihre ID-Spalte als INTERGERS oder VARCHAR definiert? –

+0

auto increment Integer –

Antwort

25

Wenn Sie die letzte id für jede asker wollen, dann sollten Sie eine Aggregatfunktion verwenden:

SELECT max(id) as id, 
    asker 
FROM questions 
GROUP by asker 
ORDER by id DESC 

Der Grund, warum Sie das ungewöhnliche Ergebnis erhalten haben, liegt darin, dass MySQL eine Erweiterung zu GROUP BY verwendet, die es ermöglicht, dass Elemente in einer Auswahlliste nicht aggregiert und nicht in der GROUP BY-Klausel enthalten sind. Dies kann jedoch zu unerwarteten Ergebnissen führen, da MySQL die zurückgegebenen Werte auswählen kann. (Siehe MySQL Extensions to GROUP BY)

Aus dem MySQL Docs:

MySQL erweitert die Verwendung von GROUP BY, so dass die Auswahlliste nicht aggregierten Spalten beziehen sich nicht in der GROUP BY-Klausel. ... Sie können diese Funktion verwenden, um eine bessere Leistung zu erzielen, indem unnötige Spaltensortierung und Gruppierung vermieden werden. Dies ist jedoch in erster Linie nützlich, wenn alle Werte in jeder nichtaggregierten Spalte, die nicht in GROUP BY benannt sind, für jede Gruppe gleich sind. Der Server kann aus jeder Gruppe einen beliebigen Wert auswählen. Wenn sie nicht identisch sind, sind die ausgewählten Werte unbestimmt. Außerdem kann die Auswahl von Werten aus jeder Gruppe nicht durch Hinzufügen einer ORDER BY-Klausel beeinflusst werden. Die Sortierung der Ergebnismenge erfolgt nach der Auswahl der Werte, und ORDER BY beeinflusst nicht, welche Werte der Server auswählt.

+0

Ich arbeite nicht mit mir – itsazzad

+0

@itssazzad Was meinst du mit "nicht für mich arbeiten"? Das ist nicht die beschreibende Erklärung eines Problems. – Taryn

+2

Wenn ich 'SELECT *, Max (ID) als ID' verwende, gibt es kein korrektes Ergebnis – itsazzad

2

Die Aufzeichnungen müssen gruppiert GROUP BY und MAX() mit, um die maximale ID für jeden asker zu erhalten.

SELECT asker, MAX(ID) ID 
FROM TableName 
GROUP BY asker 

OUTPUT

╔════════╦════╗ 
║ ASKER ║ ID ║ 
╠════════╬════╣ 
║ Bob ║ 2 ║ 
║ Marley ║ 3 ║ 
╚════════╩════╝ 
+0

Wie erhalten Sie die maximale ID für jede ID? – fungusanthrax

1

Die anderen sind richtig über die Verwendung von MAX (ID), um die gewünschten Ergebnisse zu erhalten. Wenn Sie sich fragen, warum Ihre Abfrage nicht funktioniert, ist es, weil ORDER BY passiert nach der GROUP BY.

15

Normalerweise erlaubt MySQL die Gruppierung nur nach aufsteigender Reihenfolge. So können wir Datensätze vor der Gruppierung bestellen.

SELECT * FROM questions 
WHERE id IN 
(SELECT max(id) as id, asker 
FROM questions 
GROUP by asker 
ORDER by id DESC) 

Verbesserte Version der Antwort von @bluefeet:

 
SELECT * 
FROM (
    SELECT * 
    FROM questions 
    ORDER BY id DESC 
) AS questions 
GROUP BY questions.asker 
0

Um jede Spalte zu bekommen.