从MySQL数据库表中获取最后一个对话行

时间:2011-12-08 06:43:20

标签: mysql sql

我在MYSQL中有一个数据库,它有一个如下所示的聊天表。

enter image description here

我正在使用此查询来获取这些记录

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.

那么我们如何为该结果编写查询?

3 个答案:

答案 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)