我正在尝试使用以下代码来获取当前用户最近聊过的6个用户。我有两个问题。首先,如果当前用户已收到来自其他用户但仅发送的消息,则不提取该其他用户。其次,ORDER BY子句导致错误。我是SQL的初学者,所以我不知道发生了什么。 在此先感谢!
以下是代码:
SELECT users.*
FROM users INNER JOIN
messages fromuser
ON (fromuser.fromid = users.id) INNER JOIN
messages touser
ON (touser.toid = users.id)
WHERE fromuser.toid = :userid OR touser.fromid = :meid
GROUP BY users.id
ORDER BY MAX(messages.datetime)
LIMIT 6;
答案 0 :(得分:0)
你的逻辑注定要失败,因为一个users.id
不能同时是两个不同的值。我认为这个查询可以满足您的需求:
SELECT u.*
FROM messages m INNER JOIN
users u
ON (m.fromid = u.id AND m.toid = :userid) OR
(m.toid = u.id AND m.fromid = :userid )
GROUP BY u.id
ORDER BY MAX(m.datetime) DESC
LIMIT 6;
请注意,它不是当前用户users
加入id
表。
答案 1 :(得分:0)
这应该可以完成你的工作,到目前为止,它比你的其他答案更少依赖MySQL扩展。我估计它会有相同的表现,但它确实更有说服力。
SELECT u.*
FROM (
SELECT DISTINCT otherid
FROM (
SELECT
m.fromid AS otherid,
MAX(m.datetime) as maxts
FROM messages m
WHERE m.toid = :userid
GROUP BY m.fromid
UNION ALL
SELECT
m.toid AS otherid,
MAX(m.datetime) as maxts
FROM messages m
WHERE m.fromid = :userid
GROUP BY m.toid
) um
ORDER BY maxts DESC
LIMIT 6
) otheru
INNER JOIN users u
ON u.id = otheru.otherid