2014-09-23 119 views
9

我想用idorig對mysql記錄進行分組,並選擇max id以便選擇最新記錄。選擇MAX(ID)mysql

我的數據庫的內容是這樣的:

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 

我的SQL請求是:

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

的SQL返回良好ID:

但問題是,如果我嘗試返回狀態,我得到不是

如何更改SQL請求與組idorig以獲得最新的ID,甚至得到的102記錄不是100

回答

14

錯誤發生,因爲MySQL不知道分組記錄中的哪個狀態會導致您的結果。它知道你想從組中選擇max(id),但根據狀態並不明顯。一些SQL引擎會觸發異常,但不是MySQL。它返回組中的第一條記錄(本例中狀態= 2),我猜。你可以這樣來做

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

MySQL是要得到最大(ID),每個組(這是唯一的),然後使用它的父查詢,選擇有趣的數據,從這個特點而言的記錄。

+0

這是我想要的結果 – Nathan 2014-09-23 13:36:15

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

您在子查詢中有組語句(可以返回多個結果),然後嘗試將其與單個變量進行比較。在所有情況下它都不能正常工作。 – 2014-09-23 12:58:11

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

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

第一個是最好的邏輯。 – 2014-09-23 12:54:04

+0

我很不確定這是否是作者想要的效果。讓我們等待他的想法。 – 2014-09-23 12:56:21

+0

是的,我忘了說,請求可能會返回多個結果,我基本上想顯示一個消息列表,按ID分組選擇每個組的最新ID(我編輯原始帖子) – Nathan 2014-09-23 13:32:13

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

由於未找到from子句,這肯定會給出錯誤消息。 – 2014-09-23 12:53:37

+0

並且由於查詢前後有多個空格^ _ ^ – 2014-09-23 13:11:37