MySql中每个组的已连接项目数

时间:2016-05-26 10:51:18

标签: mysql sql join group-by

我需要获得一组结果,显示每个'esta'组累积的项目数。

我正在按照企业对结果进行分组。

建立与内部联系。

左连接项目与基础连接。

所以在Esta组2中,假设有3个基本id。附加到基本ID的每个书面和口头记录将计入结果集中的esta。 每条基本记录可附加多个“书面”或“口头”。

我在数据库中有6个verbals和4个written,它们分布在不同的'esta'记录中。在我的查询中,它们都计入我得到的结果的第一行。

我尝试了相同的更多数据,不管'esta',第一行包含每个左连接元素一起计算。

SQL:

SELECT 
     esta.enf_esta_id
     ,SUM(IF(verbal.enf_verbal_id is not null,1,0)) as verbals
     ,SUM(IF(written.enf_written_id is not null,1,0)) as writtens
FROM 
     enf_base base
          INNER JOIN enf_esta esta ON esta.enf_esta_id = base.enf_esta_id
          LEFT JOIN enf_verbal verbal ON verbal.enf_base_id = base.enf_base_id
          LEFT JOIN enf_written written ON written.enf_base_id = base.enf_base_id
WHERE 
     1=1
GROUP BY 
     esta.enf_esta_id

结果:

enf_esta_id verbals writtens
2           10      10
3           1       0
4           1       1
6           0       0

为证明顶行不正确,以下是从enf_esta_id 2获取动词和写入的结果。

SELECT 
     COUNT( * ) AS total
FROM 
     enf_written
         INNER JOIN enf_base ON enf_base.enf_base_id = enf_written.enf_base_id
         INNER JOIN enf_esta ON enf_base.enf_esta_id = enf_esta.enf_esta_id
WHERE 
     enf_esta.enf_esta_id =2

的产率:

5

与enf_verbal相同的产生2.如果我们对问题查询结果的顶行进行折扣,则将每个的总数加起来给出正确的10。

任何人都可以帮助我获得我需要的结果吗?

1 个答案:

答案 0 :(得分:1)

你正在成倍增加。假设有2个动词和5个写入,那么你的连接就会产生这10个记录(即所有组合)。而不是然后加入表并聚合,您应首先聚合然后加入聚合。在您的情况下,这是每个基本ID的聚合,您最终将进一步聚合以获得estas。

select 
  base.enf_esta_id,
  coalesce(sum(verbal.cnt), 0) as verbals,
  coalesce(sum(written.cnt), 0) as writtens
from enf_base base 
left join
(
  select enf_base_id, count(*) as cnt
  from enf_verbal
  group by enf_base_id
) verbal on verbal.enf_base_id = base.enf_base_id
left join
(
  select enf_base_id, count(*) as cnt
  from enf_written
  group by enf_base_id
) written on written.enf_base_id = base.enf_base_id
group by base.enf_esta_id;