如何一次查询一系列范围内的count()?

时间:2009-04-26 18:50:28

标签: sql database

我正在尝试在phpBB论坛上撰写论坛排名细分。论坛排名由您的postcount定义:如果您有1-9个帖子,则为1级; 10-24你是2级;等等。 (最高等级是2000以上的任何职位。)

现在,我的论坛排名统计页面只是做了一堆愚蠢的查询:

SELECT COUNT(*) from _users WHERE post_count>=1 AND post_count<10;
SELECT COUNT(*) from _users WHERE post_count>=10 AND post_count<25;

......等等。

查询运行几秒钟,所以我真的只是好奇(以备将来参考)一个更好的方法来解决这个问题 - 感觉应该有一个我可以运行的查询,将返回类似于这样:

rank_id | count
1       | 5000
2       | 2000
...

我还有另一张表,其中列出了排名以及达到该排名所需的最少帖子数量。不确定是否有必要或者是否有更聪明的方式来编写我的查询。

如果有任何帮助,我正在使用MySQL数据库,但我对跨数据库的答案更感兴趣。

2 个答案:

答案 0 :(得分:4)

在他们之间粘上一个UNION。

SELECT COUNT(*) from _users WHERE post_count>=1 AND post_count<10;
UNION
SELECT COUNT(*) from _users WHERE post_count>=10 AND post_count<25;

或者,您可以使用CASE WHEN来堆叠它们并将结果相加以使其成为一行。

SELECT
   SUM(CASE WHEN post_count>=1 AND post_count<10 THEN 1 ELSE 0 END) AS Between_1_10
   SUM(CASE WHEN post_count>=10 AND post_count<25 THEN 1 ELSE 0 END) AS Between_10_25
   SUM(CASE WHEN post_count>=25 AND post_count<100 THEN 1 ELSE 0 END) AS Between_25_100
FROM 
   _users 

或其他方式......

SELECT 
     Count(*) 
     , Category
FROM
(
    SELECT
       CASE 
          WHEN post_count>=1 AND post_count<10 THEN '1_To_10'
          WHEN post_count>=10 AND post_count<25 THEN '10_To_25'
          WHEN post_count>=25 AND post_count<100 THEN '25_To_100'
          ELSE 'Over_100' 
       END As Category
    FROM
       _users
) as InnerTable
GROUP BY
   Category

答案 1 :(得分:0)

我认为你正在寻找SELECT CASE...WHEN.