当前位置: 首页 > 知识库问答 >
问题:

如何使用Group by语句从表中选择最新记录

许天逸
2023-03-14
msg_id     msg(messages)  sender(user id)  receiver (user id)  time (timestamp)
------------------------------------------------------------------------------
 1              hello bro             1              2                 12am
 2              hello                 2              1                 12am
 3              i disscuss something  1              2                 12:01am
 4              are you free          1              2                 12:03am

-----------------------------------------------------
**User Table**
-----------------------------------------------------
 u_id       user_name    
  1           khalid
  2           brain
  3           abdullah
SELECT sender.user_name sender, receiver.user_name receiver,
       messages.time msgtime, messages.msg msg,sender.u_id u_id,
       sender.user_name user_name FROM messages LEFT JOIN user 
       AS sender ON messages.sender = sender.u_id LEFT JOIN user
       AS receiver ON messages.receiver = receiver.u_id where 
       sender.u_id<>1 group by messages.sender ORDER BY 
       messages.msg_id desc

我想要的

我想查询显示每个发件人的最新最后消息

共有1个答案

蔺劲
2023-03-14

您可以在根本不分组的情况下做到这一点--只需left将消息表连接到自身,谓词是相同的发件人,然后是时间戳。如果没有稍后的时间戳,那么第二个表中的值将为null,这意味着您已经标识了最近的消息。

select s.user_name as `from`, r.user_name as `to`, m1.msg, m1.time 
  from messages m1
    left join messages m2
      on m1.time < m2.time and m1.sender = m2.sender
    inner join users s
      on m1.sender = s.u_id
    inner join users r
      on m1.receiver = r.u_id
  where m2.sender is null;

如果您绝对想使用group by,您可以首先找到每个发件人的max(time),然后将结果连接回messages and users表,如下所示:

select s.user_name as `from`, r.user_name as `to`, m.msg, m.time
  from messages m
    inner join users s
      on m.sender = s.u_id
    inner join users r
      on m.receiver = r.u_id
    inner join (
      select sender, max(`time`) as ts
        from messages
        group by sender
    ) q on m.sender = q.sender and m.time = q.ts

这两个查询将给出相同的结果

 类似资料:
  • 问题内容: 我有一张桌子,上面有几条记录。有一个ID字段。我想选择具有最新ID(即最高ID)的记录。 有任何想法吗? 问题答案:

  • 问题内容: 我将对各种rpc调用的响应存储在具有以下字段的mysql表中: 为和的所有现有组合选择最新响应的最佳方法是什么? 对于每个日期,对于给定的方法/ ID,只能有一个响应。 并非所有呼叫组合在给定日期都必须存在。 有数十种方法,数千个ID和至少365个不同的日期 样本数据: 所需结果: (我不认为这是同一个问题-它不会给我最新的信息) 问题答案: 自我回答,但是随着表的增长,我不确定这是否

  • 问题内容: 我继承了具有以下结构的表: 是一个标识字段和主键,并且and字段上有非唯一索引。 什么是最有效的方式来获得每个项目名称的最新记录,即在上述行的表 1 , 4 和 6 ,因为他们是最先进的日期项物品应归还 一 , 乙 和 Ç 分别。 问题答案: SQL Server 2005(开始):

  • 问题内容: 我试图选择一个表中的最后6个月的条目,我有一列称为datetime,这是一种datetime mysql格式。 我已经看到许多使用间隔和其他方法的方法-应该使用哪种方法?谢谢 问题答案: 使用DATE_SUB

  • 问题内容: 可以说在employee表中,我在表的列上创建了一个索引(idx_name)。 我是否需要在select子句中明确指定索引名称,否则它将自动用于加速查询。 如果需要在select子句中指定,在select查询中使用index的语法是什么? 问题答案: 如果要测试索引以查看其是否有效,请使用以下语法: WITH语句将强制使用索引。

  • 我有两个下拉列表,我想在它们被选中后使用它们。我想在选择的基础上弹出另一个框来显示信息。当我尝试使用if语句并按下ok按钮时,它只是继续到下一行。我从一个showMessage对话框开始,但我想在一些下拉选项中显示警告。它不起作用。我还需要能够循环返回主菜单,以便他们可以做出不同的选择。 我现在拥有的例子: