Объединение трех таблиц по нескольким внешним ключам и группирование их по дате - PullRequest
0 голосов
/ 15 января 2020

У меня есть три таблицы с общими уникальными идентификаторами и некоторые другие поля, скажем, 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), так что я получу только отчетливые строки?

1 Ответ

1 голос
/ 15 января 2020

Я думаю, union all даст точные подсчеты:

select dte, user_id, country_id,
       sum(is_comment), sum(is_post), sum(is_tag)
from ((select date(created_at) as dte, user_id, country_id, 1 as is_comment, 0 as is_post, 0 as is_tag
       from comments
      ) union all
      (select date(created_at) as dte, user_id, country_id, 1 as is_comment, 0 as is_post, 0 as is_tag
       from posts
      ) union all
      (select date(created_at) as dte, user_id, country_id, 1 as is_comment, 0 as is_post, 0 as is_tag
       from tags
      )
     ) cpt
group by dte, user_id, country_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...