我有一个问题:
在查询中,我需要检查回复和互动(如果存在)。我想知道哪个用户做了回复或互动,并将其包含在我的行中。我目前有这个:
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,另一个返回正确的用户的名字。有人能帮助我吗?
答案 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 )