MySQL由用户获得最低3个值

时间:2016-11-25 19:28:25

标签: mysql sorting group-by

我有一个MySQL数据库,我希望用一个人来理解最低的3点。

+--------+--------+
| Person | Points |
+--------+--------+
| 1      | 15     |
| 1      | 10     |
| 1      | 5      |
| 1      | 10     |
| 2      | 5      |
| 2      | 4      |
| 2      | 3      |
| 2      | 2      |
| 3      | 1      |
| 3      | 1      |
| 3      | 1      |
+--------+--------+

我想要的结果:

+-------+-----+
| 1     | 25  |
| 2     | 9   |
| 3     | 3   |
+-------+-----+

但我真的迷失了如何解决这个问题。这是我的查询到现在为止:

SELECT person, SUM(points) FROM (SELECT SUM(points) FROM table 
GROUP BY person ORDER BY points ASC LIMIT 3)

这是我的SQL创建脚本:

CREATE TABLE `mytable` (
  `person` int(11) DEFAULT NULL,
  `points` int(11) DEFAULT NULL
) ;

INSERT INTO `mytable` (`person`, `points`) VALUES
(1, 15),
(1, 10),
(1, 5),
(1, 10),
(2, 5),
(2, 4),
(2, 3),
(2, 2),
(3, 1),
(3, 1),
(3, 1);

1 个答案:

答案 0 :(得分:2)

在内部查询中使用行号作为帮助来限制行数。但是数量并不限制以避免重复值问题。没有经过测试但它应该有效,懒得创建小提琴。

SELECT Person,SUM(Points) FROM
(SELECT Person,Points,
CASE Person
         WHEN @person THEN @rank:= @rank+ 1 
         ELSE @rank:= 1
     END AS rank,
     @person:= person 
FROM t, (SELECT @rank:= 0,@person:='') x
ORDER BY Points ASC)y
WHERE y.rank<=3
GROUP BY Persons

FIDDLE