2012-03-21 56 views
0

我有一個簡單的消息傳遞架構,其中每個消息都有一個senderFK和一個recipientFK,每個消息映射到一個用戶記錄。對於當前用戶,我需要獲得所有不同的線程。不同的線程是發送或接收消息的用戶的senderFK或recipientFK。SQL - 需要查詢以獲得用戶ID所有不同的消息線程

因此,舉例來說:

此查詢獲取誰傳話給當前用戶的所有用戶:

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

此查詢獲取誰收到了當前用戶信息的所有用戶:

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

我怎麼會這些查詢組合成具有鮮明的一行爲每個用戶和單個列(線程ID)的單個表?

+0

如果Michael的UNION不是您要查找的內容,您可以顯示一些您想要的示例行?如果這是正確的結果,請接受它。當您執行UNION時,所有列(此例中爲一列)中的值都重複的任何行只會在輸出中顯示一次。聽起來這就是你想要的。 – 2012-03-21 21:05:46

回答

3

像這樣的東西應該工作:

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會過濾掉任何重複。

+0

是的,不需要DISTINCT。 – Redtopia 2012-03-21 21:17:29

1

如果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' 
相關問題