MySQL查询可获取用户的所有朋友,包括他们之间最后发送的消息

时间:2019-06-08 18:55:31

标签: mysql sql mariadb

我有3张桌子:

os_users(用户名,用户名), os_friends(user_id,target_id,lastaction,时间), os_messages(用户ID,目标ID,消息,时间)。

我现在想得到用户的所有“朋友”,包括他们之间最后写的1条消息。

此查询可以很好地获取所有朋友及其用户名,并按它们之间的lastaction排序(24个用于测试目的,其为我的user_id):

SELECT os_friends.*, os_users.username, os_users.user_id AS friend_id 
FROM os_friends 
LEFT JOIN os_users ON os_friends.user_id = os_users.user_id OR os_friends.target_id = os_users.user_id

WHERE os_users.user_id != 24 AND (os_friends.user_id = 24 OR os_friends.target_id = 24) 
ORDER BY os_friends.lastaction DESC

我也想在结果中得到该“友谊”的最后一条消息(无论是发送给谁的两个人),最好是“ AS lastmessage”。

希望你能帮助我!

1 个答案:

答案 0 :(得分:0)

假设(user_id,target_id,时间)在os_messages表中是唯一的

Select * from os_users osu 
left join os_friends osf on osu.user_id = osf.user_id
left join os_messages osm on osm.user_id = osf.user_id and osm.target_id = osf.target_id
where not exists (
  Select * from os_messages osm1 where osm1.user_id = osm.user_id and osm1.target_id = osm.target_id and osm1.time > osm.time
)