2014-09-23 12 views
9

Chcę zgrupować rekord mysql z idorig i wybierz max id, aby wybrać najnowszy rekord.Wybierz MAX (ID) mysql

Moja zawartość bazy danych jest tak:

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 

Moje zapytanie SQL jest:

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

SQL zwraca dobrą ID:

Ale problemem jest to, że jeśli próbuję zwrócić status, otrzymałem nie

Jak mogę zmienić sql wniosek, aby uzyskać najnowsze id z grupy idorig a nawet uzyskać rekordy z 102 nie 100

Odpowiedz

14

błędu dzieje się tak, ponieważ MySQL nie wie, który status z pogrupowanych rekordów powinien skutkować. Wie, że chcesz mieć max (id) z grupy, ale jego status nie jest oczywisty. Niektóre silniki SQL będą powodowały wyjątki, ale nie MySQL. Zwraca pierwszy rekord z grupy (status = 2 w tym przypadku). Można zrobić to w ten sposób

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

MySQL dostanie max (id) dla każdej grupy (co jest unikalne), a następnie używać go w kwerendzie nadrzędnej, aby wybrać interesujący dane z tego DANE rekordy.

+0

To jest wynik, który chciałem – Nathan

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

Masz polecenie grupowe w podzapytaniu (które może zwrócić wiele wyników), a następnie próbujesz porównać je do pojedynczej zmiennej. Nie będzie dobrze działać we wszystkich przypadkach. –

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

lub

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

Pierwsza to najlepsza logika spośród wszystkich. –

+0

Nie jestem do końca pewien, czy to efekt, którego chce autor. Poczekajmy na jego przemyślenia na ten temat. –

+0

Tak, zapomniałem powiedzieć, żądanie może zwrócić wiele wyników, zasadniczo chcę wyświetlić listę wiadomości, pogrupowane według ID wybierając najnowszy identyfikator każdej grupy (redagowałem oryginalny wpis) – Nathan

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

To na pewno spowoduje błąd msg z powodu nie znaleziono klauzuli. –

+0

I ze względu na wiele spacji przed i po zapytaniu^_ ^ –