Как по-прежнему получать данные из таблицы в запросе объединения, если в объединенной таблице нет ничего подходящего

#mysql #sql

#mysql #sql

Вопрос:

У меня есть база данных, которая содержит две таблицы,

snm_content и snm_fields_values

snm_content имеет множество полей, id имеет значение только здесь и snm_fields_values имеет три поля, item_id , field_id и value

поле id of snm_content совпадает с полем item_id of snm_fields_values .

Я хочу получить все данные snm_content и присоединиться snm_fields_values , но также извлекать данные, snm_content если ничего нельзя объединить. Так что, если совпадения нет item_id snm_fields_values , тогда все равно получайте данные snm_content .

Проблема в следующем запросе, из которого я получаю результаты, только snm_content если есть совпадение item_id в snm_fields_values

 SELECT cnt.*,
MAX(case when f.field_id = 4 then f.value end) as service_icon
FROM snm_fields_values f
JOIN snm_content cnt
ON cnt.id = f.item_id
WHERE cnt.catid = 9
AND cnt.state = 1
ORDER BY cnt.ordering
  

Если item_id для id in snm_content ничего не существует, ничего не извлекается snm_content . Как я могу это исправить? Я попытался изменить порядок извлечения данных, но это дало тот же результат.

Комментарии:

1. У вас есть SUM() , но нет GROUP BY .

Ответ №1:

Используйте left join :

 SELECT cnt.*,
       MAX(case when f.field_id = 4 then f.value end) as service_icon
FROM snm_content cnt LEFT JOIN
     snm_fields_values f
     ON cnt.id = f.item_id
WHERE cnt.catid = 9 AND cnt.state = 1
GROUP BY cnt.id
ORDER BY cnt.ordering;
  

Обратите внимание, что это добавляет GROUP BY , поэтому вы получаете одну строку на группу в таблице содержимого.

Вы также можете использовать коррелированный подзапрос:

 SELECT cnt.*,
       (SELECT MAX(case when f.field_id = 4 then f.value end)
        FROM snm_fields_values f
        WHERE cnt.id = f.item_id
       ) as service_icon
FROM snm_content cnt 
WHERE cnt.catid = 9 AND cnt.state = 1
GROUP BY cnt.id
ORDER BY cnt.ordering;