У меня есть три таблицы с общими уникальными идентификаторами и некоторые другие поля, скажем, comments
, posts
и tags
:
комментарии:
id | user_id | country_id | zone_id | created_at
сообщений:
id | user_id | country_id | zone_id | created_at
теги:
id | user_id | country_id | zone_id | created_at
Теперь я хочу получить количество строк комментариев, сообщений и тегов, сгруппированных по дням на основе created_at
столбец и сгруппированы по парам user_id
, country_id
и zone_id
, что-то вроде:
date | user_id | country_id | zone_id | count(comments.id) | count(posts.id) | count(tags.id)
Проблема в том, что все три таблицы имеют миллионы строк, поэтому я хочу использовать соединение без дублирования как можно больше. Я придумал это:
select date(c.datetime), c.user_id, c.country_id, c.zone_id, count(distinct(c.id)), count(distinct(p.id)), count(distinct(t.id))
from comments c
inner join posts p
inner join tags t
group by date(c.datetime), c.user_id, c.country_id, c.zone_id;
Удивительно, но это дает правильные результаты, но дает много дублированных строк из-за объединений - это плохо, потому что, возможно, в будущем я захочу использовать SUM
вместо этого, и я больше не могу использовать DISTINCT
.
Как я могу соединить эти три таблицы этими тремя внешними ключами (user_id
, country_id
, zone_id
), так что я получу только отчетливые строки?