按最大列查询分组

时间:2014-10-28 10:44:07

标签: mysql sql

我想查询按特定用户的聊天伙伴分组的最后聊天消息。我当前的查询有效,但它选择按时间戳排序的伙伴分组的用户自己的消息。但我希望其他用户发送给该特定用户的最后一条消息按时间戳排序。

这是我的小提琴: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

2 个答案:

答案 0 :(得分: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表(如下所示),在这些时间戳中,您无法找到所需的消息。因此,查询将永远不会返回给我#34;

|                     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 |

答案 1 :(得分:1)

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

    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函数之前内部查询中的排序顺序