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

Gle*_*son 0 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
Run Code Online (Sandbox Code Playgroud)

我要找的结果是:

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
Run Code Online (Sandbox Code Playgroud)

我目前的查询是:

 SELECT MAX(ID), Message, Date_Sent, related_id FROM MESSAGES GROUP BY RELATED_ID LIMIT 0,100
Run Code Online (Sandbox Code Playgroud)

我得到的结果是:

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
Run Code Online (Sandbox Code Playgroud)

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

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

Tar*_*ryn 9

您将需要使用子查询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
Run Code Online (Sandbox Code Playgroud)

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

来自MySQL Docs:

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