2014-10-03 48 views
1

我有问题:SQL左参加条件或其他条件

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

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 != '') 

这个有点返回我wan't除了与交互表返回重复警报ID,第一个说,警方公布这是a.user_id对警报的互动0另一个返回正确的用户名称。有人能帮我吗?

+0

(a.user_id ='0'AND(r.user_id!=''或i.user_id!='')) – PeterRing 2014-10-03 11:30:51

+3

您可以提供一些预期结果的数据吗? – Sadikhasan 2014-10-03 11:30:52

回答

0

您在where子句中将您的r和i用户标识引用从左连接转换为内连接。将这些条件移动到连接部分,然后针对它们中的任何一个测试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) 
+0

感谢这是最接近的答案,我需要在用户的on子句中提取AND i.user_id!='',并且它返回了令人厌恶的结果Thx! – 2014-10-03 11:56:54

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声明所需的字段。

希望这会有所帮助。