簡體   English   中英

SQL查詢內部連接和OR

[英]SQL Query Inner Join and OR

我如何使用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
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM