2014-09-23 80 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