0

我正在尝试为每个对话获取用户的最新消息。但是,我的 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 的正确数据。

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

4

2 回答 2

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

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

来自 MySQL 文档:

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

于 2013-02-22T12:03:59.473 回答
-2

也许应该是这样的

替换MAX(ID)MAX(Date_Sent)

于 2013-02-22T12:04:53.030 回答