我想查询按特定用户的聊天伙伴分组的最后聊天消息。我当前的查询有效,但它选择按时间戳排序的伙伴分组的用户自己的消息。但我希望其他用户发送给该特定用户的最后一条消息按时间戳排序。
这是我的小提琴: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
答案 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函数之前内部查询中的排序顺序