как правильно заджоинить?

imp

Новичок
Есть три таблицы:
REGION: id_reg, name
source: id_source, name, type, id_reg
message: id, title, text, load_date, id_source, id_reg

задача: для каждого региона (id_reg) подсчитать количество сообщений (COUNT(message.id)) в установленный период (load_date BETWEEN ...) с учетом типа источника сообщения (source.type='t');

запрос такой:
SELECT r.id_reg, COUNT(m.id) FROM REGION r
LEFT JOIN source s ON r.id_reg=s.id_reg
LEFT JOIN message m ON s.id_source=m.id_source
WHERE s.type='t' AND m.load_date BETWEEN '2010-09-01' AND '2010-09-10'
GROUP BY r.id_reg;

его результат: 1.JPG

видно что отсутствует 1 и 10 регионы. В заданном периоде у них отсутствуют сообщения.
нужно чтобы эти регионы тоже были указаны в результате и количество их сообщений: 0.
Подскажите чем можете.Заранее благодарен.
 

Ragazzo

TDD interested
ТС джойнт поники?О_о....называй темы нормально...а не "Как правильно селектнуть"...
 

imp

Новичок
спасибо, все получилось. Только вопрос. В мануале написано:
"Никогда не следует указывать в части ON какие бы то ни было условия, накладывающие ограничения на строки в наборе результатов. Если необходимо указать, какие строки должны присутствовать в результате, следует сделать это в выражении WHERE."
Чем это все обуславливается? Почему не сработало когда все ограничения Были в WHERE?
 

Splurov

Новичок
Не знаю, как толково объяснить, принцип работы LEFT JOIN такой :) Условия в WHERE отфильтровали результат после LEFT JOIN.
 

imp

Новичок
Ну что ж, буду читать документации, может что то найду. Спасибо еще раз.
 

iceman

говнокодер
кто такое написал что нельзя в ON? нельзя делать в ON если это возможность сделать в WHERE

условие on - это условие для склеивания записей, where - для фильтрации записей. Будь внимателен, особенно при группировках, функции подсчета, суммы и т.д. возвратят не правильный результат (не тот который требовалось ожидать). а лучше сначало склеить и убедится в правильности склеивания а потом уже делать условие.
 
Сверху