我需要获得一组结果,显示每个'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。
任何人都可以帮助我获得我需要的结果吗?
答案 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;