2009-04-26 38 views
2

我想在phpBB論壇上撰寫論壇排名的細目。論壇等級由您的帳戶數量來定義:如果您有1-9個帖子,那麼您的等級爲1; 10-24,你是2級;等等。 (最高排名是2000個以上職位的東西)如何一次查詢一系列範圍的count()?

現在,我的論壇排名統計頁面只是做了一堆啞查詢:

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數據庫如果有幫助,但我更感興趣的是跨數據庫的答案。

+0

我沒有一個解決方案,但你可以通過使用SELECT COUNT(USER_ID)整理你的查詢起來一點從_users WHERE POST_COUNT x和y之間;這可能會加速實際上非常少量的事情。 – 2009-04-26 19:01:26

回答

4

棒它們之間的統一。

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 
+0

第二個+1。 – 2009-04-27 00:19:13

0

我認爲你正在尋找SELECT CASE...WHEN.

相關問題