SQL查询内部连接和OR

时间:2017-10-11 18:09:13

标签: sql oracle

如何使用INNER JOINOR进行选择,我尝试使用以下查询,但它没有返回任何内容也没有错误

SELECT * FROM chatroom_message cm
INNER JOIN users_account ua
ON cm.userid_a = ua.reg_userid 
OR cm.userid_b = ua.reg_userid 
WHERE cm.userid_a = :chat_client OR cm.userid_b = :chat_client

4 个答案:

答案 0 :(得分:3)

SELECT * 
FROM chatroom_message cm INNER JOIN users_account ua ON cm.userid_a = ua.reg_userid 
INNER JOIN users_account ub ON cm.userid_b = ub.reg_userid 
WHERE cm.userid_a = :chat_client OR cm.userid_b = :chat_client

此处的更改是2个联接,用户表上每个用户一个联接。这是因为您在消息表中有2个不同的用户ID(没有人自己聊天),因此您需要userid_a的联接和userid_b的另一个联接。

您所拥有的联接实际上返回了0条记录,因为userid_a永远不会等于userid_b。此外,您不希望在查询的OR子句中使用WHERE

WHERE条款没问题。

答案 1 :(得分:3)

Igor的答案是直截了当的方式,但我想要摆脱通常与较差的表现相关的OR和UNION每个reg_userid的结果。如下所示:

SELECT * FROM chatroom_message cm
INNER JOIN users_account ua ON cm.userid_a = ua.reg_userid 
WHERE cm.userid_a = :chat_client
UNION ALL
SELECT * FROM chatroom_message cm
INNER JOIN users_account ua ON cm.userid_b = ua.reg_userid 
WHERE cm.userid_b = :chat_client

虽然这可能会更快,但特定chatroom_message的数据稍微难以获得,因为它分为2条记录。这取决于你之后对这些数据做了什么。

答案 2 :(得分:0)

你需要两个内连接才能工作 - 一个用于userid_a,另一个用于userid_b。

答案 3 :(得分:0)

我们说:chat_client = 123。然后,您选择所有chatroom_message条记录,其中userid_a = 123加上chatroom_message所有userid_b = 123条记录。

userid_a  userid_b
111       222         <- this one not
333       123         <- this one yes
123       444         <- this one yes

您要加入users_account这些记录。这会让你:

userid_a  userid_b  username
333       123       Mr. 333
333       123       Mr. 123
123       444       Mr. 123
123       444       Mr. 444

因此,如果您没有获得任何记录,那么用户123就没有chatroom_message记录(或者users_account中没有匹配的条目,由于外键约束,这是不可能的。

查询没问题。检查您的参数和数据。