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

Mysql 如何使用DISTINCT选择行的其余部分?,mysql,sql,distinct,Mysql,Sql,Distinct,我有一个保存消息的表和一个保存用户的表。 我想让所有进行交互的用户发送或接收用户id为1的消息。 此查询可用于: 编辑: 但如果我添加以选择消息列,它将返回重复的记录: 编辑: 我怎样才能解决这个问题 而且,我看到它在做出不同的选择之后对结果进行排序。第一个查询应该返回倒置的结果,因为消息为_id 2的行的时间为3。 有什么办法我可以在开盘前订购吗 编辑2:我不清楚这个问题。我只想为匹配的用户标识选择最后一条消息。它不会返回重复的记录,您有两条用户标识为2的记录 我不明白你要他们点什么。如果您想

我有一个保存消息的表和一个保存用户的表。 我想让所有进行交互的用户发送或接收用户id为1的消息。 此查询可用于:

编辑:

但如果我添加以选择消息列,它将返回重复的记录:

编辑:

我怎样才能解决这个问题

而且,我看到它在做出不同的选择之后对结果进行排序。第一个查询应该返回倒置的结果,因为消息为_id 2的行的时间为3。 有什么办法我可以在开盘前订购吗


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

它不会返回重复的记录,您有两条用户标识为2的记录


我不明白你要他们点什么。如果您想按相反的顺序排列,只需删除“DESC”

您想要这样的东西吗

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

请在问题中添加相关代码。它应该是自包含的。它不是重复的,因为它是一条不同的消息。@juergend代码在sqlfiddle上,使用构建的模式。@Lamak是的,但我想选择最后一条消息,并且只选择用户id不同。@AlexSorinDachin很公平,但这个要求不在您的问题上,我们无法猜测您不希望同一用户id的两条记录匹配的原因。我只想要最后一条消息。就像facebook消息中心一样,它会检索与您进行交互的所有用户。不,该查询会显示所有用户。我希望返回与第一个查询相同的行,但附加最后一条消息。就像facebook返回您在信息中心与之进行对话的所有参与者,以及最后收到或发送的消息一样。@AlexSorinDachin,查询已更新,仅向用户显示消息谢谢!这正是我想要的:我已经更改了它,以便它按时间排序最终结果:
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
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