簡體   English   中英

MySQL:范圍內的GROUP BY

[英]MySQL: GROUP BY within ranges

我有一張分數如下的表格:

  score  |  user
 -------------------
     2   |  Mark
     4   |  Alex
     3   |  John
     2   |  Elliot
    10   |  Joe
     5   |  Dude

該表實際上是巨大的,真實分數從1到25。

我需要這個:

  range   |  counts
 -------------------
   1-2    |  2
   3-4    |  2
   5-6    |  1
   7-8    |  0
   9-10   |  1

我已經找到了一些MySQL解決方案,但是它們似乎非常復雜,其中一些甚至建議使用UNION但是性能非常重要。 如前所述,桌子很大。

所以我想為什么你不簡單地擁有這樣的查詢:

SELECT COUNT(*) as counts FROM score_table GROUP BY score

我得到這個:

  score  |  counts
 -------------------
    1    |   0
    2    |   2
    3    |   1
    4    |   1
    5    |   1
    6    |   0
    7    |   0
    8    |   0
    9    |   0
   10    |   1

然后使用PHP,求和特定范圍的分數計數? 這會使性能更差嗎?還是我缺少一個簡單的解決方案?

或者,您甚至可以提出一個JavaScript解決方案...

您的解決方案:

SELECT score, COUNT(*) as counts
FROM score_table
GROUP BY score
ORDER BY score;

但是,這不會返回計數值0 假設您有所有分數的示例,那么分數的完整列表就不成問題了。 您只是不會得到零計數。

您可以使用類似的方法做您想做的事情:

select (case when score between 1 and 2 then '1-2'
             when score between 3 and 4 then '3-4'
             . . .
        end) as scorerange, count(*) as count
from score_table
group by scorerange
order by min(score);

沒有理由在php中進行其他處理。 這種查詢對於SQL是非常典型的。

編輯:

根據MySQL文檔 ,您可以在group by使用列別名。 這是確切的報價:

可以在查詢選擇列表中使用別名來為列指定其他名稱。 您可以在GROUP BY,ORDER BY或HAVING子句中使用別名來引用該列:

SELECT SUM(分數在1到2之間的情況然后...

老實說,我無法告訴您這是否比將“ SELECT COUNT(*)作為來自score_table GROUP BY分數的計數”傳遞到PHP中並讓PHP處理它的速度更快...但是它為您的設置增加了一定程度的靈活性。 創建一個三列表作為“ group_ID”,“得分”,“范圍”。 在其中插入值以正確分組

1,1,1-2

1,2,1-2

1,3,3-4

1,4,3-4

等等...

加入得分,按范圍分組。 添加的“ group_ID”允許您設置組...也許讓group 1將其分成兩個組,並讓group_ID = 2為5個設置范圍(或您可能想要的任何值)。

我發現這樣的表使用非常快,幾乎不需要更改代碼,並且如果需要其他分組或分組發生更改,則可以很容易地添加到表中(如果您在代碼中進行分組,則需要重做整個case部分)略微更改分組)。

如果您想要一個簡單且功能強大的解決方案,請在表格中添加一個額外的字段,並在其中添加一個值作為分數,以便1和2的值分別為1、3和4的值為2。 。 只有插入分數,您才需要添加一個額外的字段。 因此您的表如下所示:

score  |  user     |   range
--------------------------
   2   |  Mark     |   1
   4   |  Alex     |   2
   3   |  John     |   2
   2   |  Elliot   |   1
  10   |  Joe      |   5
   5   |  Dude     |   3

現在您可以執行以下操作:

select count(score),range from table group by range;

如果您有一個選擇優先的應用程序,這總是更快。

通過插入執行此操作:

$scoreRange = 2;
$range = ceil($score/$scoreRange);

這個怎么樣:

select concat((score + (1 * (score mod 2)))-1,'-',(score + (1 * (score mod 2)))) as score, count(*) from TBL1 group by (score + (1 * (score mod 2)))

您可以看到它在此提琴中起作用: http ://sqlfiddle.com/#! 2/215839/6

對於輸入

  score  |  user
 -------------------
     2   |  Mark
     4   |  Alex
     3   |  John
     2   |  Elliot
    10   |  Joe
     5   |  Dude

它生成此:

  range   |  counts
 -------------------
   1-2    |  2
   3-4    |  2
   5-6    |  1
   9-10   |  1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM