#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;