2017-07-26 68 views
3

表:SQL:如何用單獨的WHERE子句查找2個關聯的記錄?

users 
id: int // users has_many chat_users 

chats 
id: int // chats has_many chat_users 

chat_users 
id: int 
chat_id: int (foreign key) // chat_users belongs_to chat 
user_id: int (foreign key) // chat_users belongs_to user 

該數據庫具有以下記錄:

users, id: 1 
users, id: 2 
users, id: 3 

chats, id: 1 // <--------- 
chats, id: 2 

chat_users, id: 1, chat_id: 1, user_id: 1 // <------- 
chat_users, id: 2, chat_id: 1, user_id: 2 // <------- 
chat_users, id: 3, chat_id: 2, user_id: 2 
chat_users, id: 4, chat_id: 2, user_id: 3 

鑑於我有2個user_ids 12,我將如何編寫一個查詢的聊天記錄表中找到一個聊天:

1)與USER_ID ==一個chat_user 1

AND

2)與USER_ID == 2

一個chat_user?

+1

請下次提供樣本數據作爲DDL + DML並添加相關的rdbms標記。 –

回答

2

您需要選擇所有chat_ids與用戶之一,然後選擇所有也有第二用戶的聊天記錄:

SELECT * from chat_users where 
user_id = 1 AND chat_id in (
    SELECT chat_id from chat_users where user_id = 2) 
0

在你WHERE語句中使用IN

SELECT * FROM chat_users 其中USER_ID IN(1,2)

我不明白爲什麼你就必須把它寫在chats表時chat_users表中的數據爲chat_id。除非你有更多的數據,你需要從chats表中抽取數據,在這種情況下,你需要JOINchats表。

+0

這不起作用,但會返回任何具有用戶'1'或用戶'2'的聊天。 –

+0

是的。在看過其他答案之後,我意識到他可能並沒有要求這兩個用戶中的任何一方都沒有聊天。 – Phil

2

假設一個聊天只有兩個用戶之間發生的話,我們可以簡單地彙總chat_users表通過id並檢查最小值user_id是1,最大值user_id是2。

SELECT id 
FROM chat_users 
GROUP BY id 
HAVING MIN(user_id) = 1 AND MAX(user_id) = 2 
+0

正如你所說,如果在聊天中只有2個用戶,那麼這是一個非常好的答案。 +1 – Shawn

0

如果從聊天需要其他的細節,我假設那些將保持在chats表。爲了達到這一點,請使用

SELECT DISTINCT c.id AS chatID, <other chats.cols> 
FROM chats c 
INNER JOIN (
    SELECT c1.chat_id 
    FROM chat_users c1 
    INNER JOIN chat_users c2 ON c1.chat_id = c2.chat_id 
     AND c2.user_id = 2 
    WHERE c1.user_id = 1 
) c3 ON c.id = c3.chat_id