2016-04-26 15 views
2

私はスレッド型メッセージングサービスを組み立てています。私は自分の頭を特定のクエリにラップさせようとしています。私は現在、user_idの配列が提供されたときにthread_idを返すプロシージャを作成しようとしています。MYSQL複数のユーザーIDでメッセージスレッドIDを選択してください

テーブルには2つの列があります:thread_id & user_id。 Iは、テスト用のテーブルにおける4行を有する:

INSERT INTO thread_users (`thread_id`, `user_id`) VALUES (1,1); 
INSERT INTO thread_users (`thread_id`, `user_id`) VALUES (1,70); 
INSERT INTO thread_users (`thread_id`, `user_id`) VALUES (2,1); 
INSERT INTO thread_users (`thread_id`, `user_id`) VALUES (2,21); 

この例のユーザ1つのメッセージングユーザ70は、第1のスレッドを開始し、その後、メッセージユーザー21は、スレッド2を開始すると、

私はすでに両方のユーザーのIDを取得しようとしているので、スレッドに「購読している」ユーザーの一覧に基づいてthread_idを見つけることです。

あり、私はこの質問にそれを含めることはありませんが、参加するのカップルによって要求され、より多くのデータになるだろう...だから、それを言って、ちょうどにクエリを短縮することができますされています

SELECT DISTINCT `thread_id` 
FROM `thread_participants` 
WHERE `thread_participants`.`user_id` IN (1, 21) 
GROUP BY `thread_id` 

たのは、私はありがとうございました:-) 2人のスレッドに関連付けられているユーザまたは20 は、すべてのヘルプは大歓迎だろうがある場合、このクエリは枯れTHREAD_ID適切に返すべきであることを認識2.

返す必要があります!

+1

取得しようとしている出力例をいくつか挙げることができますか? – Tin

+0

(元の質問から - "どちらが2を返すべきですか")したがって、(1,21) - > 2 - (1,70) - > 1のuser_id配列でクエリを実行します。 1つの行が返され、選択された列はthread_id – user3617416

答えて

1

あなたは、ユーザーのthread_idは、彼らがしていることを確認して取得しようとしている場合は、あなただけの1と

SELECT participants.user_id 
FROM thread_users as participants 
INNER JOIN thread_users as my_people 
ON my_people.thread_id = participants.thread_id 
WHERE my_people.user_id IN (1,21) 

21をUSER_IDたthread_idは、すべての参加者を取得しようとしている場合は、すべての参加者でスレッド。あなたは、ユーザーのスレッドを見つけたい場合は、1( ...最後の行だけでDISTINCTのuser_idのあなたのCOUNTは1と21のあなたの2のuser_idを意味している2と同じであることを確認する

SELECT participants.thread_id,COUNT(DISTINCT participants.user_id) as participants 
FROM thread_users as participants 
WHERE participants.user_id IN (1,21) 
GROUP BY participants.thread_id 
HAVING COUNT(DISTINCT participants.user_id)=2 

このクエリを試してみてください、21,70)(1,21)を(1,21,70)に置き換えて、その最終行をHAVING COUNT(DISTINCT participants.user_id)=3に変更すると、参加者として3人のスレッドが返されます。

+0

Wonderful!ありがとう、ティン・トラン! – user3617416

+0

は2番目のクエリでしたか? –

+0

確かに!私は前に述べたようにサブクエリにそれを差し込みました、そして、それは正しい場所に私を得ました。ありがとうございました!これは明日の非常に生産的な午前のためになります。 – user3617416

関連する問題