簡體   English   中英

SQL在條件或其他條件下左聯接

[英]SQL left join on condition OR other condition

我有一個問題:

在查詢中,我需要檢查是否有答復和互動。 我想知道是哪個用戶做出了答復或互動,並將其包括在我的行中。 我目前有這個:

SELECT * FROM `alerts` a 
LEFT JOIN `interactions` i ON a.alerts = i.alert_id 
LEFT JOIN `reply` r ON a.alerts = r.alert_id 
LEFT JOIN `users` u ON u.id = r.user_id OR i.user_id 
WHERE (a.user_id = '0' AND r.user_id != '') 
OR (a.user_id = '0' AND i.user_id != '')

除了與交互表返回重復的警報ID外,這多少返回了我所不想要的信息。第一個消息說警察在該警報上發布了交互,該警報為a.user_id 0,另一個則以用戶名正確返回。 有人能幫我嗎?

在您遇到的情況下,您需要發出警報:1.表reply所引用的用戶2.表interactions所引用的用戶

由於兩個用戶在您的查詢中都具有​​不同的角色,因此建議您使用以下查詢:

SELECT *
FROM alerts A
LEFT JOIN interactions I ON I.alert_id = A.alerts
LEFT JOIN users UI ON UI.id = I.user_id
LEFT JOIN reply R ON R.alert_id = A.alerts
LEFT JOIN users UR ON UR.id = R.user_id
WHERE A.user_id = '0'

這樣,您就可以在SELECT語句中顯示所需的字段。

希望這會有所幫助。

在where子句中具有r和i用戶ID引用,將其從左聯接變為內部聯接。 將這些條件移到連接部分,然后為其中任何一個測試NOT NULL。

SELECT * 
   FROM `alerts` a 
      LEFT JOIN `interactions` i 
         ON a.alerts = i.alert_id 
      LEFT JOIN `reply` r 
         ON a.alerts = r.alert_id 
        AND r.user_id != ''
      LEFT JOIN `users` u 
         ON ( u.id = r.user_id 
           OR u.id = i.user_id )
        AND i.user_id != ''
   WHERE 
      a.user_id = '0'
      AND ( NOT r.user_id IS NULL
           OR NOT i.user_id IS NULL )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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