如何在MySQL中通过group by获得两个不同字段的计数?

如何在MySQL中通过group by获得两个不同字段的计数?,mysql,sql,count,group-by,Mysql,Sql,Count,Group By,我有一个“4表联接sql查询”。他们之间有关系。表名为、用户、文档、文档类型、文档类型组文档表具有来自其他表的所有名为uniq标识符的id。我尝试获取文档类型中的文档计数和文档类型组的总计数。(表名为土耳其语,对此表示抱歉) 我可以通过以下查询获得文档类型组的计数: SELECT eTG.evrak_tipi_grup_adi, eT.evrak_tipi, COUNT(eTG.evrak_tipi_grup_adi) AS toplamGrup FROM evraklar evr LEFT J

我有一个“4表联接sql查询”。他们之间有关系。表名为、用户、文档、文档类型、文档类型组<代码>文档表具有来自其他表的所有名为uniq标识符的id。我尝试获取文档类型中的文档计数和文档类型组的总计数。(表名为土耳其语,对此表示抱歉) 我可以通过以下查询获得文档类型组的计数:

SELECT eTG.evrak_tipi_grup_adi, eT.evrak_tipi, COUNT(eTG.evrak_tipi_grup_adi) AS toplamGrup
FROM evraklar evr
LEFT JOIN kullanicilar kull ON evr.evrak_kaydeden_ybs_kullanici_id=kull.id
LEFT JOIN evrak_tipleri eT ON evr.evrak_tipi=eT.id
LEFT JOIN evrak_tipi_gruplari eTG ON evr.evrak_tipi_grubu=eTG.id
GROUP BY eTG.evrak_tipi_grup_adi
我可以通过以下方式获得文档类型的计数:

SELECT eTG.evrak_tipi_grup_adi, eT.evrak_tipi, COUNT(eT.evrak_tipi) AS toplamTiptekiler
FROM evraklar evr
LEFT JOIN kullanicilar kull ON evr.evrak_kaydeden_ybs_kullanici_id=kull.id
LEFT JOIN evrak_tipleri eT ON evr.evrak_tipi=eT.id
LEFT JOIN evrak_tipi_gruplari eTG ON evr.evrak_tipi_grubu=eTG.id
GROUP BY eT.evrak_tipi
我希望将这些查询组合起来,在同一张表上向用户显示它们。
有什么线索吗?

看看你的SQL,我有点不确定你想要发生什么

两个片段检索eTG.evrak_tipi_grup_adi和eT.evrak_tipi,但一组一组,而第二组另一组。如果分组字段的非分组字段的值不同,则返回的值来自未指定的行,因此可能没有意义

如果值不变(即,evrak_tipleri上的任何记录在evrak_tipi_gruplari上只有一条记录-假定文档类型和文档类型组),则您当前的查询可以写成:-

SELECT eTG.evrak_tipi_grup_adi, eT.evrak_tipi, COUNT(eTG.evrak_tipi_grup_adi) AS toplamGrup
FROM evraklar evr
LEFT JOIN kullanicilar kull ON evr.evrak_kaydeden_ybs_kullanici_id=kull.id
LEFT JOIN evrak_tipleri eT ON evr.evrak_tipi=eT.id
LEFT JOIN evrak_tipi_gruplari eTG ON evr.evrak_tipi_grubu=eTG.id
GROUP BY eTG.evrak_tipi_grup_adi, eT.evrak_tipi

SELECT eTG.evrak_tipi_grup_adi, eT.evrak_tipi, COUNT(eT.evrak_tipi) AS toplamTiptekiler
FROM evraklar evr
LEFT JOIN kullanicilar kull ON evr.evrak_kaydeden_ybs_kullanici_id=kull.id
LEFT JOIN evrak_tipleri eT ON evr.evrak_tipi=eT.id
LEFT JOIN evrak_tipi_gruplari eTG ON evr.evrak_tipi_grubu=eTG.id
GROUP BY eTG.evrak_tipi_grup_adi, eT.evrak_tipi
因此可以合并为:-

SELECT eTG.evrak_tipi_grup_adi, eT.evrak_tipi, COUNT(eTG.evrak_tipi_grup_adi) AS toplamGrup, COUNT(eT.evrak_tipi) AS toplamTiptekiler
FROM evraklar evr
LEFT JOIN kullanicilar kull ON evr.evrak_kaydeden_ybs_kullanici_id=kull.id
LEFT JOIN evrak_tipleri eT ON evr.evrak_tipi=eT.id
LEFT JOIN evrak_tipi_gruplari eTG ON evr.evrak_tipi_grubu=eTG.id
GROUP BY eTG.evrak_tipi_grup_adi, eT.evrak_tipi
不过,计数只会返回这些字段中非空值的数量。我怀疑您可能想使用COUNT(DISTINCT…)来代替

然而,这在很大程度上取决于您想要计算什么以及表之间的关系(即一对多关系等)

编辑

暂时忽略用户,但我认为这是您想要的(使用sql FIDLE中的表名和列名):--


这是获取该类型的文档类型和文档数量,同时还获取该文档类型的文档组和该组中的文档数量。

请提供创建表和插入到命令,以便轻松再现您的情况。我可以将sql文件放在web上的何处?sqlfiddle.com就是这样做的。但是只要把CREATE和INSERT语句粘贴到这里就足够了。这是最难的部分。sql文件包含表创建。为什么这两条语句按不同字段聚合?为什么不通过
eTG.evrak_tipi_grup_adi,eT.evrak_tipi
进行聚合?我将尝试在计数上进行区分。这里是上一个sql的结果:但我希望将toplamGrup作为toplamtiptekiler的累积计数。这意味着我需要文档类型的计数和文档类型组的计数。我有点搞不清楚您到底想要什么。你能提供一些示例数据和你想要的结果吗?我试图得到一个结果,包括文档类型名称、该类型下的文档数以及该类型组下的文档数。有帮助吗?我手中有任何解决方案:/
SELECT doc_types.id, 
        doc_types.doc_type_name, 
        Sub1.doc_type_group_name, 
        COUNT(documents.id) AS DocsForDocType,
        Sub1.DocsForDocTypeGroup
FROM doc_types
LEFT OUTER JOIN documents
ON doc_types.id = documents.doc_type_id
LEFT OUTER JOIN
(
    SELECT doc_type_groups.id, doc_type_groups.doc_type_group_name, COUNT(documents.id) AS DocsForDocTypeGroup
    FROM doc_type_groups
    INNER JOIN documents 
    ON doc_type_groups.id = documents.doc_type_group_id
    GROUP BY doc_type_groups.id, doc_type_group_name
) Sub1
ON doc_types.doc_type_group_id = Sub1.id
GROUP BY doc_types.id, doc_types.doc_type_name, Sub1.doc_type_group_name, Sub1.DocsForDocTypeGroup;