2013-10-15 33 views
-1

计数我想列出个不同范围MySQL的 - 用户总个不同范围

用户点表格结构

+---------------+--------------+------+-------------------+----------------+ 
| Field   | Type   | Null | Default   | Extra   | 
+---------------+--------------+------+-------------------+----------------+ 
| ID   | int(11)  | NO | NULL    | auto_increment | 
| user_id  | int(11)  | NO | NULL    |    | 
| points  | int(11)  | NO | NULL    |    | 
+---------------+--------------+------+-------------------+----------------+ 

实施例数据

+----------------------+ 
| ID user_id points | 
|----------------------| 
| 1  14  5  | 
| 2  15  10  | 
| 3  5  14  | 
| 4  3  20  | 
| 5  14  10  | 
| 6  15  17  | 
| 7  5  61  | 
| 8  14  81  | 
| 9  15  12  | 
| 10 3  47  | 
| 11 15  10  | 
| 12 14  17  | 
| 13 3  27  | 
| 14 5  18  | 
| 15 3  4  | 
+----------------------+ 
计数用户

总分数(按用户分组)

+---------+---------------+ 
| user_id | total_points | 
+---------+---------------+ 
| 3  | 98   | 
| 5  | 91   | 
| 14  | 108   | 
| 15  | 49   | 
+---------+---------------+ 

首选的输出

+--------+-------+ 
| Range | Count | 
+--------+-------+ 
| 0-50 | 01 | 
| 50-100 | 02 | 
| 100-150| 01 | 
| > 150 | 00 | 
+--------+-------+ 

我如何能达到这种效果在纯MySQL的?

+0

如果重命名动态计列的东西(说'total_points'),那么你可以做'GROUP BY(total_points/50)'做你需要什么,我相信... –

+0

你尝试?如果是这样,发布您的查询.. –

回答

2
SELECT 
    CASE 
    WHEN points <= 50 THEN '0-50' 
    WHEN points BETWEEN 51 AND 100 THEN '51-100' 
    WHEN points BETWEEN 101 AND 150 THEN '101-150' 
    ELSE '> 150' 
    END AS `Range` 
    ,COUNT(*) AS `Count` 
    ,CASE 
    WHEN points <= 50 THEN 1 
    WHEN points BETWEEN 51 AND 100 THEN 2 
    WHEN points BETWEEN 101 AND 150 THEN 3 
    ELSE 4 
    END AS `Sort` 
FROM (
    SELECT user_id, SUM(points) as points 
    FROM tbl 
    GROUP BY user_id 
    ) AS summary 
GROUP BY `Range`, `Sort` 
+0

Urs是静态的,但为准确答案+1 – Romesh