【问题标题】:How do I use ORDER BY before GROUP BY in MySQL如何在 MySQL 中的 GROUP BY 之前使用 ORDER BY
【发布时间】:2021-05-11 00:26:07
【问题描述】:

我有两个表(消息和用户)

Messages 表有以下字段 {message, senderid, receiverid} 用户表有以下字段 {userid, name, email}

我想运行一个查询,以便仅获取发送给特定用户的最后一条消息。 这是查询

SELECT m.message, u.name, u.email 
from users as u, messages as m 
where m.sender = u.userid 
and m.receiver = '1' 
group by m.sender desc;

但是,这不会返回我想要的,因为它为每条发送的消息选择第一条消息,而不是最后一条消息。一个完美的解决方案应该是

SELECT m.message, u.name, u.email 
from users as u, messages as m 
where m.sender = u.userid 
and m.receiver = '1' 
order by m.sentdate desc 
group by m.sender desc;

但我无法在 GROUP BY 之前使用 ORDER 以便从最后一条消息到第一条消息排序,然后按用户分组。

请帮忙

【问题讨论】:

  • 您是否只希望每个发件人发给收件人的最后一条消息?
  • MySQL5.x 还是 MySQL8?后者有一种更便宜的方式来选择每个用户的最后一条消息。
  • mysql 5.7.我只想获取每个用户发送给特定用户的最后一条消息,而不仅仅是发送给用户的最后一条消息
  • 是的@AndyLin 这正是我想要的。例如接收者的值为“1”

标签: mysql


【解决方案1】:

试试这个

SELECT
    x.message,
    x.name,
    x.email
FROM (
    SELECT
        m.message,
        u.name,
        u.email 
    FROM users AS u, messages AS m
    WHERE m.sender = u.userid AND m.receiver = '1'
    ORDER BY m.sentdate DESC
) x
GROUP BY sender, email, message;

【讨论】:

    【解决方案2】:

    如果你只想拉最后一条消息,你可以试试-

    SELECT m.message, u.name, u.email 
      FROM users as u
      JOIN messages as m ON m.sender = u.userid
      JOIN (SELECT sender, MAX(sentdate) sentdate
              FROM messages
             GROUP BY sender) m2 ON m.sender = m2.sender
                                 AND m.sentdate = m2.sentdate
     WHERE m.receiver = '1';
    

    【讨论】:

      【解决方案3】:

      您可以使用以下查询来获取每个用户的最后 N 条消息。

      SELECT * FROM messages M1 WHERE M1.senddate 
         IN 
         (SELECT TOP 4 senddate FROM messages 
            WHERE sender=M1.sender 
            ORDER BY senddate DESC)
         AND receiver = 1;
      

      在子查询中,根据您的用例将顶部从 4 修改为 N。如果您只想要每个用户的最后 1 条消息,请将其更改为 1

      【讨论】:

      • 也没有用。我仍然给出了与我相同的结果。我通过使用 PHP 过滤结果找到了另一种方法,并且现在可以使用。感谢您的协助
      猜你喜欢
      • 2016-04-03
      • 1970-01-01
      • 2018-06-27
      • 2021-11-03
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      相关资源
      最近更新 更多