如何使用DISTINCT选择行的其余部分?

时间:2013-09-10 14:27:42

标签: mysql sql distinct

我有一个表格可以保存邮件,还有一个用户可以保存用户。 我想让所有与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选择最后一条消息。

2 个答案:

答案 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

SQL Fiddle