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.