如何使用INNER JOIN
和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 :(得分: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
中没有匹配的条目,由于外键约束,这是不可能的。
查询没问题。检查您的参数和数据。