1

我有一张用来保存消息的桌子和一张用来保存用户的桌子。我想获取与 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

但是如果我添加到 SELECTmessage列,它会返回重复的记录:

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_id2 的行有time3。有没有办法可以在“DISTINCT”之前对它们进行排序?

编辑2:我不清楚这个问题。我只想为匹配的 user_id 选择最后一条消息。

4

2 回答 2

0

它不会返回重复记录,您有两条 User_ID = 2 的记录。

我对您希望它们订购的内容感到困惑。如果您想以倒序排列它们,只需删除“DESC”

于 2013-09-10T14:33:48.313 回答
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

SQL小提琴

于 2013-09-10T15:09:45.867 回答