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