Left Join не возвращает все строки
У меня есть этот запрос в MySQL:
SELECT pr.*, pr7.value AS `room_price_high`
FROM `jos_hp_properties` pr
LEFT OUTER JOIN `jos_hp_properties2` pr7 ON pr7.property=pr.id
WHERE pr7.field=23
jos_hp_properties
Таблица содержит 27 строк, но запрос возвращает только одну. Основываясь на этом вопросе, я думаю, что это может быть связано с предложением WHERE. jos_hp_properties2
таблица имеет поля id, property, field, value, где field
это внешний ключ третьей таблицы (из которой мне не нужно получать данные).
Есть ли способ выбрать все строки из первой таблицы, включая значение из таблицы № 2, где поле равно 23 (или NULL, если нет поля 23)?
3 ответа
Конечно. Переместите условие WHERE в JOIN:
SELECT pr.*, pr7.value AS `room_price_high`
FROM `jos_hp_properties` pr
LEFT JOIN `jos_hp_properties2` pr7
ON pr7.property=pr.id
AND
pr7.field=23
Вы должны поместить критерии pr7 в объединение, а не в предложение where. Предложение where работает со всем набором результатов ПОСЛЕ соединения было выполнено.
SELECT pr.*, pr7.value AS `room_price_high`
FROM `jos_hp_properties` pr
LEFT OUTER JOIN `jos_hp_properties2` pr7 ON pr7.property=pr.id and pr7.field=23
Попробуй это:
SELECT pr.*, pr7.value AS `room_price_high`
FROM `jos_hp_properties` pr
LEFT OUTER JOIN `jos_hp_properties2` pr7 ON pr7.property=pr.id
WHERE (pr7.field=23 OR pr7.field is null)
Вы также можете использовать CTE (общее табличное выражение) для выбора, а затем использовать CTE для левого соединения.
wrc (parentid, childid) as (
select parentid, childid
from placechild
where relationshipid in (select id from placerelationship where relationship = 'Winter Region Capital')
),
stw (cnid, coid, capid, st_or_te, sid, scid,wcid) as (
select s.cnid, s.coid, s.capid, s.st_or_te, s.sid, s.scid, w.childid
from stcap s
left join wrc w
on s.sid = w.parentid
)
select * from stw