我有一个表格可以保存邮件,还有一个用户可以保存用户。 我想让所有与user_id 1交互(发送或接收消息)的用户。 此查询有效:
http://sqlfiddle.com/#!2/6a2f3/1
编辑:
SELECT DISTINCT
(CASE WHEN `user_to_id` = 1 THEN `user_from_id` ELSE `user_to_id` END) `user_id`,
users.*
FROM `messages`
INNER JOIN users
ON (CASE WHEN `user_to_id` = 1 THEN `user_from_id` ELSE `user_to_id` END) = users.user_id
WHERE `user_to_id` = 1 OR `user_from_id` = 1
ORDER BY `time` DESC
但是如果我添加SELECT message
列,它将返回重复记录:
http://sqlfiddle.com/#!2/6a2f3/2
编辑:
SELECT DISTINCT
(CASE WHEN `user_to_id` = 1 THEN `user_from_id` ELSE `user_to_id` END) `user_id`,
`messages`.`message`,
users.*
FROM `messages`
INNER JOIN users
ON (CASE WHEN `user_to_id` = 1 THEN `user_from_id` ELSE `user_to_id` END) = users.user_id
WHERE `user_to_id` = 1 OR `user_from_id` = 1
ORDER BY `time` DESC
我该如何解决?
而且,我看到它在“DISTINCT”选择完成后命令结果。第一个查询应该返回结果,因为message_id
2的行有time
3。
有没有办法可以在“DISTINCT”之前订购它们?
编辑2:我不清楚这个问题。我想只为匹配的user_id选择最后一条消息。
答案 0 :(得分:0)
它没有返回重复记录,你有两条User_ID = 2的记录。
我对你希望他们订购的东西感到困惑。如果您想按倒序排序,只需删除'DESC'
即可答案 1 :(得分:0)
你想要这样的东西吗?
SELECT *
FROM (
SELECT
users.*,
(SELECT `message` from messages
WHERE
(CASE WHEN `user_to_id` = 1 THEN `user_from_id` ELSE `user_to_id` END) = users.user_id
AND (`user_to_id` = 1 OR `user_from_id` = 1)
ORDER BY `time` DESC limit 1
) AS message
FROM users
) a
WHERE message IS NOT NULL