单个SQL查询中的多个计数 [英] Multiple counts within a single SQL query

查看:175
本文介绍了单个SQL查询中的多个计数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用以下代码获取4个特定部分中的文档数:

I'm trying to get the count of documents within 4 specific sections using the following code:

SELECT
    category.id
    , category.title
    , count(ts1.section_id) AS doc1
    , count(ts2.section_id) AS doc2
    , count(ts3.section_id) AS doc3
    , count(ts4.section_id) AS doc4
FROM
    category 
    LEFT JOIN category_link_section AS ts1
        ON (category.id = ts1.category_id AND ts1.section_id = 1)
    LEFT JOIN category_link_section AS ts2
        ON (category.id = ts2.category_id AND ts2.section_id = 2)
    LEFT JOIN category_link_section AS ts3
        ON (category.id = ts3.category_id AND ts3.section_id = 3)
    LEFT JOIN category_link_section AS ts4
        ON (category.id = ts4.category_id AND ts4.section_id = 4)
GROUP BY category.id, ts1.section_id, ts2.section_id, ts3.section_id, ts4.section_id

表'类别' id,标题等。
表'category_link_section'包含category_id,section_id和doc_id之间的id链接。

The table 'category' had an id, title etc. The table 'category_link_section' contains id linkages between category_id, section_id, and doc_id.

如果任何列的计数为0,它在该列中显示0。但是如果结果不为0,它显示所有段结果的乘法结果。所以如果我的4个计数列应该返回:1,2,0,3;它实际上会显示6,6,0,6;

If the count is 0 for any column, it displays 0 in that column. But if the result is not 0 it shows the multiplication result of all the section results. So if my 4 count columns were supposed to return: 1, 2, 0, 3; it would actually show 6, 6, 0, 6;

如果我为每个特定类别使用以下代码,我会得到我想要的结果:

If I use this following code for each specific category I get the results I want:

SELECT
    category.id
    , category.title
    , count(ts1.section_id) AS doc1
FROM
    category 
    LEFT JOIN category_link_section AS ts1
        ON (category.id = ts1.category_id AND ts1.section_id = 1)
GROUP BY category.id, ts1.section_id

但我需要每次在每个部分循环使用数据库。

but I then need to cycle through the database each time for each section.

,我需要依次遍历和调用每个部分,构造我的表外面的SQL,或者这可以在一个单一的查询?

So my question is, do I need to step through and call each section in turn, constructing my table outside the SQL, or can this be done in a single query?

推荐答案

@ VoteyDisciple的回答是但他的查询需要一些改进:

@VoteyDisciple's answer is on the right track, but his query needs some improvements:

SELECT c.id, c.title,
    SUM(ts1.section_id = 1) AS doc1,
    SUM(ts1.section_id = 2) AS doc2,
    SUM(ts1.section_id = 3) AS doc3,
    SUM(ts1.section_id = 4) AS doc4
FROM category AS c
  LEFT JOIN category_link_section AS ts1
    ON (c.id = ts1.category_id)
GROUP BY c.id;






说明:


Explanations:


  • IF()表达式是多余的,因为等式已返回1或0。

  • 取出连接条件中的 ts1.section_id = 1 ,或者永远不会获得其他 section_id 值。

  • 仅由 c.id 分组。我假设OP只需要每个类别一行,以及各个类别的每个 section_id 值的计数列。如果查询按 c.id,ts1.section_id 分组,则每个类别最多有四行。

  • 移动在选择列表中的逗号。漂浮在线条开始处的逗号看起来很丑陋。 ; - )

  • The IF() expressions are redundant because equality already returns 1 or 0.
  • Take the ts1.section_id=1 out of the join condition, or you'll never get the other section_id values.
  • Group by c.id only. I assume the OP only wants one row per category, and columns for counts of each section_id value for the respective category. If the query grouped by c.id, ts1.section_id, then there'd be up to four rows per category.
  • Move the commas in the select-list. Commas floating at the start of the line look ugly. ;-)

这篇关于单个SQL查询中的多个计数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆