【问题标题】:Group by query with max column使用 max 列按查询分组
【发布时间】:2014-10-28 10:44:07
【问题描述】:

我想查询某个用户的聊天伙伴最近的聊天消息。我当前的查询有效,但是它选择了按时间戳排序的合作伙伴分组的用户自己的消息。但我想要其他用户发送给这个特定用户的最后一条消息,按时间戳排序。

这是我的小提琴:Sqlfiddle

预期结果:2 行

...    message
--------------------
...    r to me last
...    m to me last

我已经准备好聊天消息,时间戳最大的消息称为“x to me last

我目前的查询是:

SELECT A.*, DU.user as username, DU.photo, DU.city, DU.year, DU.month, DU.day
            FROM db_chats A
            INNER JOIN (
               SELECT max(timestamp) ts, user, partner
               FROM db_chats
               GROUP BY  partner) T
              on A.timestamp=T.ts 
             and A.user=T.user
            LEFT JOIN  db_users DU on T.partner = DU.id 
            WHERE A.user = 'RGXiLkVpKGc4FSU7SeyMlZ7z' ORDER BY A.timestamp desc

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您可以使用this查询得到结果:

    select A.*, DU.user as username, DU.photo, DU.city, DU.year,
    DU.month, DU.day from db_chats A, db_users DU where timestamp in
    (select max(timestamp) from db_chats 
     where partner ="RGXiLkVpKGc4FSU7SeyMlZ7z" group by user)
     and  a.USER = DU.ID         
     order by timestamp desc
    

    编辑

    您的原始查询不起作用的原因是由于您的内部联接:

           SELECT max(timestamp) ts, user, partner
           FROM db_chats
           GROUP BY  partner
    

    这个查询的结果是:

    |         TS |                     USER |                  PARTNER |
    |------------|--------------------------|--------------------------|
    | 1414453415 | xAlX66JQfmsOcotg00wPsZfx | RGXiLkVpKGc4FSU7SeyMlZ7z |
    | 1414453387 | RGXiLkVpKGc4FSU7SeyMlZ7z | xAlX66JQfmsOcotg00wPsZfx |
    | 1414443546 | RGXiLkVpKGc4FSU7SeyMlZ7z | YZQF4hbvyjbS0p7wYIR2Hkq9 |
    

    如果您检查您的 db_chats 表(如下),在这些时间戳中您找不到所需的消息。因此查询永远不会返回“r to me last”

    |                     USER |                  PARTNER |      MESSAGE |  TIMESTAMP |
    |--------------------------|--------------------------|--------------|------------|
    | xAlX66JQfmsOcotg00wPsZfx | RGXiLkVpKGc4FSU7SeyMlZ7z |      r to me | 1414443447 |
    | YZQF4hbvyjbS0p7wYIR2Hkq9 | RGXiLkVpKGc4FSU7SeyMlZ7z |      m to me | 1414442845 |
    | YZQF4hbvyjbS0p7wYIR2Hkq9 | RGXiLkVpKGc4FSU7SeyMlZ7z | m to me last | 1414453415 |
    | RGXiLkVpKGc4FSU7SeyMlZ7z | xAlX66JQfmsOcotg00wPsZfx |      me to r | 1414453387 |
    | RGXiLkVpKGc4FSU7SeyMlZ7z | YZQF4hbvyjbS0p7wYIR2Hkq9 |      me to m | 1414443546 |
    | xAlX66JQfmsOcotg00wPsZfx | RGXiLkVpKGc4FSU7SeyMlZ7z | r to me last | 1414453234 |
    

    【讨论】:

    • 非常感谢。完美运行!我得到了预期的结果,你有正确的小提琴吗?
    • 点击"this" 很喜欢小提琴 :) 呵呵,不客气。
    • 但它不按时间戳顺序排序?
    • 是的,我忘了那个。 Here is the update
    【解决方案2】:

    这是您需要的查询的简化版本。我没有向用户表添加连接来为用户获取额外的数据,但我认为这样更清楚。

        SELECT  user, partner,message,MAX(timestamp)  FROM 
        (SELECT  user, partner,message,timestamp FROM db_chats ORDER BY timestamp DESC) DC
        WHERE partner = 'RGXiLkVpKGc4FSU7SeyMlZ7z'
        GROUP BY user,partner 
    

    关键是GROUP BY使用MAX函数之前内部查询中的排序顺序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-05
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 2015-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多