[英]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.