代码之家  ›  专栏  ›  技术社区  ›  Dan Lew

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

  •  2
  • Dan Lew  · 技术社区  · 17 年前

    我正试图在PHPBB论坛上对论坛排名进行细分。论坛排名是由您的邮政编码来定义的:如果您有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
    ...
    

    我还有另外一张表,上面列出了排名和达到这个排名所需的最少职位数。不确定这是必要的还是有更聪明的方法来写我的问题。

    如果有帮助的话,我使用的是MySQLDB,但是我对跨数据库的答案更感兴趣。

    2 回复  |  直到 17 年前
        1
  •  4
  •   Eoin Campbell    17 年前

    在他们之间插一个工会。

    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;
    

    或者,您可以使用一个案例,在什么时候将它们堆叠起来,并对结果求和以将其放到一行上。

    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
    
        2
  •  0
  •   DOK    17 年前

    我想你在找 SELECT CASE...WHEN.