MySQL Group通过使用MAX错误的结果

时间:2013-02-22 11:58:18

标签: php mysql database group-by

我正在尝试为每个对话获取用户最新消息。但是我的查询组似乎没有带回正确的行。这是我的数据:

ID | MESSAGE | RELATED_ID | DATE_SENT
 2 | Hi      |     2      | 2013-02-21 16:03:00
 3 | Hii     |     2      | 2013-02-21 16:04:00
 4 | Hiii    |     2      | 2013-02-21 16:05:00
 5 | Hiiii   |     2      | 2013-02-21 16:06:00
 6 | Bye     |     6      | 2013-02-21 16:03:01
 7 | Byee    |     6      | 2013-02-21 16:04:01
 8 | Byeee   |     6      | 2013-02-21 16:05:01
 9 | Again   |     9      | 2013-02-21 16:03:02
 10| Againn  |     9      | 2013-02-21 16:04:02

我要找的结果是:

ID | MESSAGE | RELATED_ID | DATE_SENT
 5 | Hiiii   |     2      | 2013-02-21 16:06:00
 8 | Byeee   |     6      | 2013-02-21 16:05:01
 10| Againn  |     9      | 2013-02-21 16:04:02

我目前的查询是:

 SELECT MAX(ID), Message, Date_Sent, related_id FROM MESSAGES GROUP BY RELATED_ID LIMIT 0,100

我得到的结果是:

ID | MESSAGE | RELATED_ID | DATE_SENT
 5 | Hi      |     2      | 2013-02-21 16:03:00
 8 | Bye     |     6      | 2013-02-21 16:03:01
 10| Again   |     9      | 2013-02-21 16:03:02

似乎获取了正确的ID,但没有获得该ID的正确数据。

我很感激我能得到的任何帮助。

2 个答案:

答案 0 :(得分:6)

您需要使用子查询为每个max(id)选择related_id,然后将其加入到您的表中:

select m1.id,
  m1.message,
  m1.related_id,
  m1.date_sent
from messages m1
inner join
(
  select max(id) MaxId, related_id
  from messages
  group by related_id
) m2
  on m1.id = m2.MaxId
  and m1.related_id = m2.related_id
LIMIT 0,100

SQL Fiddle with Demo。这样做将确保为SELECT列表中的其他列返回正确的值。当您没有GROUP BY或聚合SELECT列表中的所有项目时,MySQL会选择其他列的值,您可能会得到意外的结果。 (见MySQL Extensions to GROUP BY

来自MySQL文档:

  

MySQL扩展了GROUP BY的使用,因此选择列表可以引用GROUP BY子句中未命名的非聚合列。 ...您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能。但是,当GROUP BY中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。此外,添加ORDER BY子句不会影响每个组中值的选择。选择值后会对结果集进行排序,而ORDER BY不会影响服务器选择的值。

答案 1 :(得分:-1)

也许应该是这样的

MAX(ID)替换为MAX(Date_Sent)