JOIN и отображение COUNT равного нулю
Есть две таблицы:
- names
- events
Нужно из name выбрать все имена отвечающие определенному условию, а из events количество определенного типа событий, которые относятся к выбранным именам. При этом если количество событий равно нулю, то строка с названием должна быть, а значение COUNT должно быть равно NULL или 0, не важно.
Сделал такой запрос:
SELECT
names.name,
COUNT (*)
FROM
names
LEFT OUTER JOIN events ON (
names.id = events.address
)
WHERE
events.type IN (1)
AND names.notallow in (0)
AND events.time >= now() - '1 day' :: INTERVAL
GROUP BY
names.name
ORDER BY
names.name
Но он возвращает только те строки, в которых значение COUNT > 0. Как получить полный список name, в котором будут отображаться и NULL значения и значения >0?
Ответы (1 шт):
При использовании LEFT JOIN любое условие во WHERE по правой таблице (в данном случае - events), если это не условие "что-то IS NULL", немедленно превращает его в INNER JOIN. Все условия такого типа должны помещаться в ON.
SELECT names.name,
COUNT(events.address) cnt
FROM names
LEFT OUTER JOIN events ON names.id = events.address
AND events.type IN (1)
AND events.time >= now() - '1 day' :: INTERVAL
WHERE names.notallow in (0)
GROUP BY names.name
ORDER BY names.name