【问题标题】:How does one query for count() on a series of ranges at once?如何一次在一系列范围内查询 count()?
【发布时间】:2009-04-27 03:13:40
【问题描述】:

我正在尝试在 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
...

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

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

【问题讨论】:

  • 我没有解决方案,但是您可以使用 SELECT COUNT(user_id) from _users WHERE post_count BETWEEN x AND y; 来稍微整理一下您的查询;这可能会加速非常非常小的速度。

标签: sql database


【解决方案1】:

在它们之间添加一个 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

【讨论】:

  • 在第三个选项中(您在 CASE WHEN 中派生类别并对其进行分组),您的第二个和第三个案例是否需要 >= 标准?如果不是 >= 10,则第一种情况会捕获它,依此类推。无论哪种方式,第三个选项都是 +1。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多