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
Другие вопросы по тегам