2016-04-26 44 views
2

我正在放在一起的線程消息服務,我試圖包圍我的頭一輪特定的查詢。我目前正在嘗試創建一個過程,它會在提供一個user_id數組時返回thread_id。MYSQL選擇消息線程ID由多個用戶ids

表中只有兩列:thread_id & user_id。 我有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以開始第一線程,然後消息用戶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.

我認識到,該查詢將返回正確的thread_id枯萎,如果有相關的線程2個用戶或20 任何幫助將不勝感激:-)謝謝!

+1

你可以給你一些你想要得到的輸出例子嗎? – Tin

+0

(來自原始問題 - 「其中應該返回2.」)因此,查詢user_id數組爲(1,21) - > 2 - 或 - (1,70) - > 1。它會返回一行,並選擇列將thread_id – user3617416

回答

1

,如果你只是想獲得已user_id說明1和21

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) 

一個thread_id單的所有參與者,如果你試圖讓你的用戶的thread_id確保他們都參加線程。那就試試這個查詢

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 

最後一行只是確保你的DISTINCT的user_id COUNT等於2,這意味着你的2 USER_ID的1和21 ... 如果你想找到的用戶線(1 ,21,70),你會用(1,21,70)替換(1,21)並將底線改爲HAVING COUNT(DISTINCT participants.user_id)=3,那麼它將返回包含這3人作爲參與者的線程。

+0

太棒了!謝天謝地! – user3617416

+0

是你之後的第二個查詢嗎? –

+0

當然是!我把它插入到前面提到的子查詢中,它讓我到了正確的地方。謝謝!這將使明天的工作高效。 – user3617416