首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择Last messages from last receiver。mysql

选择Last messages from last receiver。mysql
EN

Stack Overflow用户
提问于 2017-12-26 02:22:43
回答 2查看 572关注 0票数 4

我的桌子

代码语言:javascript
复制
id|receiver|sender|content|time
1 |   6    |  2   |  a    | 13:33
2 |   4    |  3   |  b    | 13:35
3 |   4    |  3   |  c    | 14:01
4 |   5    |  3   |  d    | 14:03
5 |   7    |  2   |  e    | 14:05
6 |   4    |  3   |  f    | 14:07

我的预期结果:

代码语言:javascript
复制
id|receiver|sender|content|time
6 |   4    |  3   |  f    | 14:07
3 |   4    |  3   |  c    | 14:01
2 |   4    |  3   |  b    | 13:35

目前我的方法是:

代码语言:javascript
复制
SELECT * FROM `meassages`
  WHERE `sender` = 3 AND `receiver` IN (
    SELECT `receiver` FROM `messages` ORDER BY `time` DESC LIMIT 1
  ) ORDER BY `time` DESC

有没有更简单的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-26 02:42:39

尽管您的查询看起来很好,但它假定最后一条消息来自sender = 3。因此,最好在子查询中包含一个where

代码语言:javascript
复制
SELECT m.*
FROM messages m
WHERE m.sender = 3 AND 
      m.receiver = (SELECT m2.receiver
                    FROM messages m2
                    WHERE m2.sender = m.sender
                    ORDER BY m2.time DESC
                    LIMIT 1
                   )
ORDER BY m.time DESC;

使用=而不是IN强调了子查询返回一行。此外,我还添加了表别名和限定列名。

票数 1
EN

Stack Overflow用户

发布于 2017-12-26 02:29:12

试着这样做:

代码语言:javascript
复制
SELECT m1.* 
FROM `meassages` AS m1
INNER JOIN
(
   SELECT receiver, MAX(time) AS LatestTime
   FROM messages 
   group by receiver
) AS m2  ON m1.receiver = m2.receiver 
        AND m1.`time` = m2.LatestTime
WHERE m1.`sender` = 3;

内部查询将为您提供每个接收器的最新时间,这应该是最后一个接收器。然后,使用基于此最新时间的再次连接表,您将删除除具有最新时间的行之外的所有行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47971058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档