Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 通过多个外键连接三个表并按日期分组_Mysql_Sql_Join - Fatal编程技术网

Mysql 通过多个外键连接三个表并按日期分组

Mysql 通过多个外键连接三个表并按日期分组,mysql,sql,join,Mysql,Sql,Join,我有三个表共享公共的唯一ID和一些其他字段,比如注释,帖子,以及标签: 评论: id | user_id | country_id | zone_id | created_at 职位: id | user_id | country_id | zone_id | created_at 标签: 我现在想做的是,我想获得评论、帖子和标签的行数,根据在列中创建的按天分组,并根据用户id、国家id和区域id对分组,类似于: date | user_id | country_id | zone_id |

我有三个表共享公共的唯一ID和一些其他字段,比如
注释
帖子
,以及
标签

评论:

id | user_id | country_id | zone_id | created_at
职位:

id | user_id | country_id | zone_id | created_at
标签:

我现在想做的是,我想获得评论、帖子和标签的行数,根据在列中创建的
按天分组,并根据
用户id
国家id
区域id
对分组,类似于:

date | user_id | country_id | zone_id | count(comments.id) | count(posts.id) | count(tags.id)
问题是这三个表都有数百万行,所以我希望尽可能使用不重复的join。我想到了这个:

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


我如何通过这3个外键(
user\u id
country\u id
zone\u id
)连接这三个表,以便只得到不同的行?

我认为
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

这似乎是一个常见的错误,人们希望某些子查询的某些联接或联合(每个可能涉及不同的键),每个子查询可能涉及联接和/或聚合,但他们错误地尝试进行所有联接/联合,然后进行所有聚合或在以前的聚合上进行聚合。PS这还不清楚。使用足够的单词、句子和引用部分例子,清楚、完整地说出你的意思。当给出一个业务关系(ship)/关联或表(base或query result)时,请说明其中的一行根据其列值表示的业务状况。请在代码问题中给出一个--cut&paste&runnable代码;示例输入(作为初始化代码)以及所需和实际输出(包括逐字错误消息);标签和版本;清晰的说明和解释。对于包含DBMS、DDL和表格初始化的SQL。
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