繁体   English   中英

查询返回其他行

[英]Query returns additional rows

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

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

这几乎可以正常工作,我的问题是它返回的不是我的对话的最后一条消息,而是每个用户的最后一条消息,因此,假设用户12正在交谈,并且我正在获取此列表,这就是我得到的:

+----+---------+-----------+-----------------------+------+---------------------+
| 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条记录中最高的字段,所以我该如何解决呢?

编辑删除group by即使用户与多个用户交谈,我也只收到一条消息

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

我相信,groupby将束缚他们。

您正在从每个用户那里获得最后一条消息,因为您已经为to_user和from_user都完成了GROUP BY。

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

这是您的操作方式:

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中,通过聚合其他列的组返回每个组的第一行。 通过选择有序行集(内部查询)的形式,我们可以获取每次会话的最新行。

删除in语句中的group by子句-在这种情况下,它是无用的。 它为to_userfrom_user每个不同配对返回sent时间戳。 您实际上只希望在to_userfrom_user等于某个值的情况下sent的最大值。 通过丢失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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM