【问题标题】:SQL - need a query to get all distinct message threads given a userIDSQL - 需要一个查询来获取给定用户 ID 的所有不同消息线程
【发布时间】:2012-03-22 05:00:54
【问题描述】:

我有一个简单的消息传递模式,其中每条消息都有一个 senderFK 和一个 recipientFK,每个都映射到一个用户记录。对于当前用户,我需要获取所有不同的线程。一个不同的线程是发送或接收消息的用户的 senderFK 或接收者FK。

所以,例如:

此查询获取向当前用户发送消息的所有用户:

SELECT DISTINCT senderFK AS threadID FROM Messages
WHERE recipientFK = 'usr_developer'

这个查询获取所有收到当前用户消息的用户:

SELECT DISTINCT recipientFK AS threadID FROM Messages
WHERE senderFK = 'usr_developer'

如何将这些查询组合到一个表中,该表中每个用户都有一个不同的行和一个列 (threadID)?

【问题讨论】:

  • 如果 Michael 的 UNION 不是您想要的,您能否展示几行您想要的示例?如果是正确的结果,请接受。当您执行 UNION 时,所有列(本例中为一列)中的值重复的任何行仅在输出中出现一次。听起来这就是你想要的。

标签: sql tsql


【解决方案1】:

这样的事情应该可以工作:

SELECT recipientFK as UserId, senderFK as ThreadID
 FROM Messages
UNION
SELECT senderFK as UserID, recipientFK AS threadID
 FROM Messages

此方法会根据您的评论 ...a distinct row for each user ... 忽略用户过滤器

【讨论】:

    【解决方案2】:
    SELECT senderFK AS threadID 
    FROM Messages
    WHERE recipientFK = 'usr_developer'
    
    UNION
    
    SELECT recipientFK AS threadID 
    FROM Messages
    WHERE senderFK = 'usr_developer'
    

    请注意,您不再需要 DISTINCT,因为 UNION 将过滤掉所有重复项。

    【讨论】:

    • 是的,不需要 DISTINCT。
    【解决方案3】:

    如果是 SQL Server,您可以执行以下操作:

    select distinct case when senderFK = 'usr_developer' then recipientFK else senderFK end ThreadID
    from Messages
    where 'usr_developer' in (senderFK, recipientFK)
    

    同样,如果您喜欢/它的表现更好,您可以更改 WHERE 子句:

    select distinct case when senderFK = 'usr_developer' then recipientFK else senderFK end ThreadID
    from Messages
    where senderFK = 'usr_developer' 
       or recipientFK = 'usr_developer'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-12
      • 2019-02-18
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多