mysql:唯一消息线程

hivapdat  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(262)

我有一个包含如下列的messages表
消息\标识、消息\到\标识、消息\来自\标识、消息\正文、项目\标识。
我想要一个特定用户的消息线程列表。消息线程应该具有字段message\ u to\ u id、message\ u from\ u id和project\ u id的唯一组合。
早些时候,我在project\u id上使用了groupby,但我不想让他们在project上使用groupmessage。

SELECT * FROM message
WHERE message_to = '{$user_id}' OR message_from = '{$user_id}'
GROUP BY project

这没有如预期的那样起作用。

SELECT * 
FROM message 
WHERE message_to = '{$user_id}' 
GROUP BY message_from 
UNION 
SELECT * 
FROM message 
WHERE message_from = '{$user_id}' 
GROUP BY message_to

这是向我显示来自和不想要的消息的组合。
我想要一个单一项目上的每个用户组合的消息线程。
样本数据

message_id | message_from_id | message_to_id | project_id | message _body
1          |  283            |  284          | 4          | Hello         
2          |  284            |  283          | 4          | Hi            
3          |  285            |  283          | 4          | Hey there!    
4          |  283            |  285          | 4          | Greetings     
5          |  283            |  284          | 6          | Cool!

我想要什么

message_id | message_from_id | message_to_id | project_id | message _body 
1          |  283            |  284          | 4          | Hello                
3          |  285            |  283          | 4          | Hey there!  
5          |  283            |  284          | 6          | Cool!

i、 e忽略消息\u from \u id和消息\u to \u id顺序,但与项目\u id一起,它们应该是唯一的。

hfwmuf9z

hfwmuf9z1#

正确的答案是忽略message\ u to和message\ u from的组合,并给出相同的区别。

SELECT DISTINCT 
    CASE WHEN message_from_id < message_to_id 
    THEN message_from_id 
    ELSE message_to_id END as message_from_id, 
    CASE WHEN message_from_id < message_to_id 
    THEN message_to_id 
    ELSE message_from_id END as message_to_id, 
    project 
FROM message 
WHERE message_to_id = '{$user_id}' OR message_from_id = '{$user_id}'

这样它就可以在没有groupby子句的情况下工作。
但是这个解决方案的问题是,我不能得到任何像sent\u at这样的非独立列(我在这里没有提到)。

uxh89sit

uxh89sit2#

我用一个 ON 或排名方法( ROW_NUMBER 或者 DENSE_RANK )虽然这与所有的sql版本都不兼容,但环顾四周,我发现 JOIN 似乎能完成任务的方法。
以下是我的结果:

SELECT message.message_id, message_to_id, message.message_from_id, message.project_id, message.message_body FROM 
  message
INNER JOIN
  (
  SELECT MIN(message_id) message_idMIN FROM message WHERE message_to_id = 283 GROUP BY project_id, message_to_id
    UNION 
  SELECT MIN(message_id) message_idMIN FROM message WHERE message_from_id = 283 GROUP BY project_id, message_from_id
  ) message_group
ON message.message_id = message_group.message_idMIN;

请看这里的小提琴:http://sqlfiddle.com/#!9/ef36a1/32号

相关问题