2017-10-11 95 views
4

如何选择使用INNER JOINOR,我用下面的查询尝试,但它不返回任何东西也没有错误SQL查询内部联接和OR

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 
+0

我添加了Oracle标签基于参数格式。请改变它,如果这个假设是不正确。 – Igor

+0

它不喜欢的是,就工作,我知道OR会过滤,您可以使用Union,看看这是否有帮助:https:// stackoverflow。 com/questions/19725014/sql-server-left-join-with-or-operator – DHLopez

+0

你没有得到结果而不知道哪里cluase?我怀疑:chat_client无效 – xQbert

回答

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,每个用户在用户表上加入一个。这是因为你在消息表中有两个不同的用户ID(没有人自己聊天),所以你需要加入userid_a和另一个加入userid_b

由于userid_a永远不会等于userid_b,所以您的连接有效返回了0条记录。你也不想在你的WHERE子句中输入OR这个这个查询。

WHERE子句很好。

+0

这工作,请我有另一个问题,我可以帮你了吗? – Peter

+0

@PhilipJems - 15分钟宽限期过后,请考虑使用右侧的chekmark标记答案。如果你还有其他问题,请在[so]上发布一个新问题,向现有问题添加新问题通常会被忽视,除非它与发现过程密切相关或出现问题(*即:有些人在评论部分提出了问题你正在回答他们,但有一个问题*)。 – Igor

+0

我很惊讶这被接受。 OP的查询中的连接应该没有问题,因为它是'OR' not'AND':'ON cm.userid_a = ua.reg_userid或者cm.userid_b = ua。reg_userid'。因此,将选择具有* userid_a'matching *或*'userid_b'匹配的记录。 –

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点的记录之间的分裂。这取决于你以后用这些数据做什么。

+0

其实我在你的系统中使用你的代码,但是我把他标记为回答,因为他的回答是第一个 – Peter

+0

这应该是接受的答案 – DHLopez

0

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

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 

所以,如果你没有得到任何记录,那么就根本没有chatroom_message记录用户123(或存在users_account没有匹配条目应因外键约束是不可能的。

查询是好的。请检查您的参数和数据。