SQL在条件或其他条件下保持连接

时间:2014-10-03 11:27:31

标签: mysql sql join left-join

我有一个问题:

在查询中,我需要检查回复和互动(如果存在)。我想知道哪个用户做了回复或互动,并将其包含在我的行中。我目前有这个:

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,另一个返回正确的用户的名字。有人能帮助我吗?

2 个答案:

答案 0 :(得分:1)

在您的情况下,您需要提醒:  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语句中显示所需的字段。

希望这会有所帮助。

答案 1 :(得分:0)

您在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 )