2017-07-26 35 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