我在MYSQL中有一个数据库,它有一个如下所示的聊天表。
我正在使用此查询来获取这些记录
SELECT * FROM (
SELECT * FROM `user_chats`
WHERE sender_id =2 OR receiver_id =2
ORDER BY id DESC
) AS tbl
GROUP BY sender_id, receiver_id
但我的要求只有5,4 ID的记录。基本上我的要求id在2个用户之间获取最后一个对话。这里介于2& 3个用户对话有2条记录,我们只想要最后一条,即id = 5,这里不需要id = 2.
那么我们如何为该结果编写查询?
答案 0 :(得分:2)
SELECT
*
FROM
user_chats uc
WHERE
not exists (
SELECT
1
FROM
user_chats uc2
WHERE
uc2.created > uc.created AND
(
(uc.sender_id = uc2.sender_id AND uc.reciever_id = uc2.reciever_id) OR
(uc.sender_id = uc2.reciever_id AND uc.reciever_id = uc2.sender_id)
)
)
答案 1 :(得分:2)
以下内容为您提供最新记录(假设id
越大,创建的时间越晚)符合您的条件:
SELECT * FROM `user_chats`
WHERE (`sender_id` =2 AND `receiver_id` =3) OR (`sender_id` =3 AND `receiver_id` =2)
ORDER BY `id` DESC
LIMIT 1
如果id
是主键,它会随着created
的值上升而上升,这是一个好主意。否则(如果您在id
上升时不确定created
上升),请将ORDER BY
行替换为以下内容:
ORDER BY `created` DESC
另外,在这两种情况下,放置正确的索引:id
(如果它是您的主键,则无需在其上添加其他索引),{{1和sender_id
(最好是复合索引,意思是两列的单个索引),receiver_id
(如果你想使用created
而不是ORDER BY created DESC
- 否则就没有了需要的。)
答案 2 :(得分:0)
尝试GROUP BY LEAST(sender_id, receiver_id), GREATEST(sender_id, receiver_id)