两个没有子查询的简单COUNT列

时间:2013-09-07 17:22:05

标签: mysql sql

1。)数据模型

我将数据模型大大减少到相关部分,这里是:

DOCUMENT
  id

DOCUMENT2FILE
  document_id (references DOCUMENT)
  file_id     (references FILE)

FILE
  id
  filetype_id (references FILETYPE)

FILETYPE
  id
  name

2。)演示数据

假设我们有以下数据(加入表格和SELECT所有内容):

document.id   file.id   filetype.id   filetype.name

1             1         1             PDF
1             2         1             PDF
1             3         2             XML
1             4         2             XML

2             5         1             PDF
2             6         2             XML

3             7         1             PDF

4             8         2             XML

5             NULL      NULL          NULL

所以有5个文件,每个文件可以附加几个文件。每个文件都有一种文件类型(仅限PDF或XML)。

3.。)所需的查询结果

现在,我想运行一个查询,它输出以下结果集:

document_id   pdf_count   xml_count
1             2           2
2             1           1
3             1           0
4             0           1
5             0           0

4.)效率低下的解决方案

我提出了这个查询,它产生了完全想要的结果:

SELECT
    id,

    (SELECT COUNT(*)
     FROM
         document,
         document2file,
         file,
         filetype
     WHERE document.id = document2file.document_id
     AND document2file.file_id = file.id
     AND file.filetype_id = filetype.id
     AND document.id = document_global.id
     AND filetype.name = "PDF") AS pdf_count,

     (SELECT COUNT(*)
     FROM
         document,
         document2file,
         file,
         filetype
     WHERE document.id = document2file.document_id
     AND document2file.file_id = file.id
     AND file.filetype_id = filetype.id
     AND document.id = document_global.id
     AND filetype.name = "XML") AS xml_count

FROM
    document document_global;

5。)问题

这个查询工作正常,但是......

有没有办法在没有这两个子查询的情况下更有效地做到这一点?有没有办法用COUNT,GROUP BY和HAVING来做呢?

如果有人能帮助我并告诉我如何提高效率,我会非常高兴。非常感谢你提前。

1 个答案:

答案 0 :(得分:2)

我认为你只想要条件求和:

select d2f.id,
       sum(case when ft.name = 'PDF' then 1 else 0 end) as PDF_count,
       sum(case when ft.name = 'XML' then 1 else 0 end) as XML_count
from document2file d2f join
     file f
     on d2f.file_id = f.id join
     filetype ft
     on f.filetype_id = ft.id
group by d2f.id;