我有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”。
希望你能帮助我!
答案 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
)