我有一个“4表加入sql查询”。他们之间有关系。表名是,用户,文档,document_type,document_type_group。 documents
表具有来自其他表的所有id为uniq标识符的id。我尝试获取document_types中的文档计数和document_type_groups的总计数。 (表名是土耳其语,对不起)
我可以通过以下查询获得document_type_groups的计数:
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
我可以通过以下方式获取document_type的数量:
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
我希望将这些查询组合在同一个表上显示给用户。 任何线索?
答案 0 :(得分:1)
看看你的SQL,我有点不确定你想要发生什么。
这两个部分都检索eTG.evrak_tipi_grup_adi和eT.evrak_tipi,但是一个一个地分组,而另一个分组。如果非分组字段的值变化因分组字段而异,则返回的值来自未指定的行,因此可能毫无意义。
如果值没有变化(即,evrak_tipleri上的任何记录在evrak_tipi_gruplari上只有一条记录 - 假设docuement类型和文档类型组),那么您当前的查询可以写成: -
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小提琴中的表名和列名): -
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;
这是获取该类型的文档类型和文档数,同时获取文档类型的文档组和该组中的文档数。