INNER JOIN中的條件將要求failed_logins.ip_address
具有非NULL值。任何具有該列的NULL值的行都將被排除。這將消除連接的「外部」failed_logins
。 (在users
任何行不具有匹配的行failed_logins
,外聯接將從failed_logins
創造一個虛擬的匹配行,所有匹配的虛擬行中的列將是NULL。
所以,我們需要要返回的方式允許failed_logins.ip_address
NULL
值。
一種選擇是,以使該內連接外連接。也就是說,LEFT
取代INNER
。
還有一些其他的方式來處理這種類型的的問題,但這實際上取決於我們想返回的結果集d預期的結果將對澄清規範有很長的路要走。
編輯
重新閱讀的問題後,它仍然是不明確的,我們希望返回的結果。爲什麼我們需要查看banned
表? 「如果數據確實存在,過濾數據」並不能真正解釋規範。
如果在banned
中有匹配的行,我們想要排除結果集中的行嗎?或者,我們想要返回banned
中不存在匹配行的行。
隨訪
不要的failed_logins
和banned
第一之間加入,在共線視圖(或,派生表使用MySQL說法)。然後在users
和派生表之間進行外連接。
作爲一個例子:
SELECT users.*
, fl.*
FROM users
LEFT
JOIN (SELECT f.user_id
, f.ip_address
FROM failed_logins f
JOIN banned b
ON b.ip_address = f.ip_address
) fl
ON fl.user_id = users.user_id
ORDER BY users.user_id, fl.ip_address
鑑於failed_logins
樣本數據:
user_id ip_address
---------- ------------
111 127.0.0.1
111 192.168.0.1
222 127.0.0.1
333 192.168.0.1
444 4.4.4.4
和banned
樣本數據
ip_address
----------
127.0.0.1
並假設users
包含五個行,111通555,該查詢應該返回:
user_id user_id ip_address
------- ------- ----------
111 111 127.0.0.1
222 222 127.0.0.1
333 (null) (null)
444 (null) (null)
555 (null) (null)
如果這不符合規格,請考慮提供一些示例數據(包括應該和不應該被返回的行例的例子),與預期輸出一起。
你的問題不是很清楚,我..請更新您的查詢,並添加適當的數據樣本和預期的結果 – scaisEdge
爲什麼user.user_id應等於emails.email_id?也許你可以添加表結構,使我們可以幫助您 –
感謝您的意見,更新的問題是,我可以清楚。之後會添加例如數據如果需要的話,但不得不把頭伸出現在。 – Andrew