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, за исключением того, что в таблице взаимодействия возвращается дубликат идентификатора оповещения. Первый сказал, что полиция сообщила о взаимодействии с этим предупреждением, которое является a.user_id 0, а другое возвращает правильное имя пользователя. Кто-нибудь может мне помочь?

2 ответа

У вас есть свои идентификаторы идентификаторов пользователей r и я в предложении where, которое переводит его из левого соединения в внутреннее соединение. Переместите эти условия на часть соединения, затем проверьте 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 )


В вашей ситуации у вас есть предупреждение: 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.

Надеюсь, это поможет.

licensed under cc by-sa 3.0 with attribution.