2012-03-21 9 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' 

これらのクエリを、ユーザーごとに個別の行と1つの列(threadID)を持つ単一の表に組み合わせるにはどうすればよいですか。

+0

マイケルのユニオンがあなたが探していたものでない場合、あなたが望むもののいくつかのサンプル行を表示できますか?それが正しい結果なら、それを受け入れてください。 UNIONを実行すると、すべての列(この場合は1つの列)の値が重複している行は、出力に1回しか表示されません。そして、それはあなたが望んだように聞こえます。 –

答えて

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' 

UNIONは、任意の重複を除外しますので、あなたは、もうDISTINCTを必要はありません。

+0

さて、DISTINCTは必要ありません。 – Redtopia

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' 
関連する問題