2014-09-23 13 views
9

Ich möchte mysql Datensatz mit Idorig gruppieren und wählen Sie die maximale ID, um den neuesten Datensatz auszuwählen.Wählen MAX (ID) mysql

Meine Datenbank Inhalt ist wie folgt aus:

ID  | IDORIG  | MESSAGE | STATUS 
100 | 100  | azerty  | 2 
101 | 100  | azerty  | 1 
102 | 100  | azerty  | 1 
103 | 100  | azerty  | 0 
104 | 104  | azerty  | 0 
105 | 104  | azerty  | 0 
106 | 104  | azerty  | 0 
107 | 104  | azerty  | 0 
108 | 104  | azerty  | 0 

My SQL Anfrage:

SELECT MAX(id),message,idorig,status FROM messages GROUP BY idorig order by id desc 

Die SQL gibt die gute ID:

Aber Problem ist, dass Wenn ich versuche, den Status zurückzugeben, habe ich nicht

Wie kann ich SQL-Anfrage ändern, um die neuesten id mit Gruppe idorig zu bekommen und auch die Aufzeichnungen von 102 nicht 100

Antwort

14

Der Fehler erhalten findet statt, weil MySQL nicht weiß, welcher Status aus gruppierten Datensätzen Ihnen zusteht. Es weiß, dass Sie max (id) aus der Gruppe wollen, aber der entsprechende Status ist nicht offensichtlich. Einige SQL-Engines würden Ausnahme, aber nicht MySQL toggern. Es gibt den ersten Datensatz aus der Gruppe (Status = 2 in diesem Fall), denke ich. Sie können es auf diese Weise

Select id, idorig, message, status where id in (SELECT MAX(id) FROM messages GROUP BY idorig) 

MySQL Max (id) für jede Gruppe wird erhalten dann (die einzigartig ist) verwenden es in übergeordneten Abfrage interessante Daten zur Auswahl dieser Aufzeichnungen ANGABEN.

+0

Dies ist das Ergebnis, das ich wollte – Nathan

-2
SELECT id,message,idorig,status FROM messages where id = (select max(ID) from messages GROUP BY idorig) order by id desc 
+1

Sie haben eine Gruppenanweisung in der Unterabfrage (die mehrere Ergebnisse zurückgeben kann) und versuchen dann, sie mit einer einzelnen Variablen zu vergleichen. Es wird nicht in allen Fällen gut funktionieren. –

4
select ID,idorig,Message,Status from messages order by ID desc limit 1; 

oder

Select ID,idorig,Message,Status from messages where ID = (select max(ID) from messages); 
+1

Der erste ist die beste Logik unter allen. –

+0

Ich bin mir nicht ganz sicher, ob dies der Effekt ist, den der Autor will. Warten wir auf seine Gedanken darüber. –

+0

Ja, ich vergaß zu sagen, die Anfrage kann mehrere Ergebnisse zurückgeben, ich möchte im Grunde eine Liste von Nachrichten angezeigt, nach ID gruppiert die letzte ID jeder Gruppe (ich bearbeitet den ursprünglichen Beitrag) – Nathan

-3
Select id, idorig, message, status where id in (SELECT MAX(id) FROM messages GROUP BY idorig) 
+1

Dies wird sicherlich einen Fehler msg aufgrund von Klausel nicht gefunden. –

+0

Und wegen der mehreren Leerzeichen vor und nach der Abfrage^_ ^ –