[英]SQL Query Inner Join and OR
我如何使用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
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
。
您所擁有的userid_a
實際上返回了0條記錄,因為userid_a
永遠不會等於userid_b
。 此外,您不希望WHERE
子句中的OR
用於此查詢。
WHERE
子句沒問題。
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個記錄。 這取決於你之后對這些數據的處理方式。
您需要兩個內連接才能工作 - 一個用於userid_a,另一個用於userid_b。
讓我們說: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
沒有匹配的條目,由於外鍵約束,這是不可能的。
查詢沒問題。 檢查您的參數和數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.