查询返回其他行

时间:2012-01-17 19:20:53

标签: mysql sql

我有这种简单聊天的表格:

messages table structure
+----+---------+-----------+---------+------+------+
| id | to_user | from_user | message | read | sent |
+----+---------+-----------+---------+------+------+

我需要获得每个对话的列表

Username ----  Message ---- Date

我正在使用此查询来执行此操作:

SELECT *
FROM `messages`
WHERE `sent`
IN (
   SELECT MAX( `sent` )
   FROM `messages`
   WHERE `from_user` = '1' --id of user who is requesting the list
   OR `to_user` = '1'  --id of user who is requesting the list
   GROUP BY `to_user` , `from_user`
   )
LIMIT 0 , 30

这项工作几乎没问题,我的问题是它不会返回该对话的最后消息,而是来自每个用户的最后消息,所以让我们说用户1和{{1}正在说话,我得到这个清单,这就是我得到的:

2

我想只收到 4 的最后一条消息,因为+----+---------+-----------+-----------------------+------+---------------------+ | id | to_user | from_user | message | read | sent | +----+---------+-----------+-----------------------+------+---------------------+ | 3 | 2 | 1 | Message 1 from user 1 | 0 | 2012-01-11 13:20:54 | | 4 | 1 | 2 | Message 1 from user 2 | 0 | 2012-01-11 13:24:59 | +----+---------+-----------+-----------------------+------+---------------------+ 字段是第4条记录中最高的,所以我该如何解决呢?

编辑删除sent后,即使用户与多个用户通话,我只收到一条消息

4 个答案:

答案 0 :(得分:1)

SELECT *
FROM `messages`
WHERE `sent`
IN (
   SELECT MAX( `sent` )
   FROM `messages`
   WHERE (`from_user` = '1' OR `to_user` = '1')
   )
LIMIT 0 , 30

。小组依旧将他们结合起来。

答案 1 :(得分:1)

您正在收到每个用户的最后一条消息,因为您已为两者执行GROUP BY:to_user和from_user。

您的查询中无需使用GROUP BY子句。

答案 2 :(得分:1)

这是你如何做到的:

SELECT *
FROM (SELECT * 
  FROM messages
  WHERE from_user = ?
  OR to_user = ?
  ORDER by from_user, to_user, sent DESC
) x
GROUP BY from_user, to_user
ORDER BY sent DESC
LIMIT 1;

在mysql中,没有聚合其他列的组会返回每个组的第一行行。通过选择形式有序行集(内部查询),我们得到每个对话的最新行。

答案 3 :(得分:0)

删除group by语句中的in子句 - 在这种情况下它没用。它为sentto_user的每个不同配对返回from_user个时间戳。您真的只想要sentto_user等于某个值的最大from_user。丢失group by,您将返回一条记录,向用户显示最新消息或从用户返回消息。

看起来像这样:

SELECT *
FROM `messages`
WHERE `sent`
IN (
   SELECT MAX( `sent` )
   FROM `messages`
   WHERE `from_user` = '1' --id of user who is requesting the list
   OR `to_user` = '1'  --id of user who is requesting the list
   )
LIMIT 0 , 30
相关问题