在MySql查询中获取每个组的最大值

时间:2016-01-19 04:57:32

标签: mysql

虽然我之前已经意识到这个问题有多种形式,但遗憾的是处理这个问题的线程对我的情况没有帮助。

我有一个看起来像这样的表:

id|forename|surname|house|gen|academic|sense|dedicated|balance|respect
-------------------------------------------------------------------------
1 |dav1    |jone1  |n    |1  |2       |3    |4        |5      |18
2 |dav2    |jone2  |s    |1  |2       |3    |4        |5      |9
3 |dav3    |jone3  |w    |1  |2       |3    |4        |5      |10
4 |dav4    |jone4  |w    |1  |2       |3    |4        |5      |11
5 |dav5    |jone5  |n    |1  |2       |3    |4        |5      |12
6 |dav6    |jone6  |h    |1  |2       |3    |4        |5      |13
7 |dav7    |jone7  |h    |1  |2       |3    |4        |5      |14

我想要的输出是:

id|forename|surname|house|total
-------------------------------
1 |dav1    |jone1  |n    |33  
4 |dav4    |jone4  |w    |26  
2 |dav2    |jone2  |s    |24  
7 |dav7    |jone7  |h    |29  

因此它获得了六个整数列的总和,然后从每个房子中获取最高值并返回总数,名称,房屋和id。

我做了很多迭代,似乎我需要做一个嵌套表(我不知道它的确切术语),但这就是我一直在努力的方法:

SELECT utable.id, utable.forename, utable.surname, utable.house, (utable.gen+utable.academic+utable.sense+utable.dedicated+utable.balance+utable.respect) AS utable.points
FROM (
    SELECT house, max(`gen`+`academic`+`sense`+`dedicated`+`balance`+`respect`) AS pts FROM users             GROUP BY house
) AS ntable
INNER JOIN users AS utable ON utable.house = ntable.house AND utable.points = ntable.pts

然而它不起作用,特别是现在说utable.points有一个以前找到的别名。我认为这与我如何对列进行求和以得出总分数有关,但我不确定。

非常感谢任何帮助:)

(虽然我知道这会被标记为重复请求,但我已经尝试了其他线程和一些网站尝试使其工作无济于事。我在phpMyAdmin服务器类型中测试它是MariaDB 5.5。 46-MariaDB-1ubuntu0.14.04.2 - (Ubuntu))

谢谢!!!

2 个答案:

答案 0 :(得分:1)

你快到了,基本上你需要一个子查询来获取上面的信息:

SELECT u.id, u.forename, u.surname, u.house, max_u.pts
FROM users u, (
    SELECT house, max(gen+academic+sense+dedicated+balance+respect) pts 
    FROM users
    GROUP BY 1
) AS max_u
WHERE u.house = max_u.house 
and gen+academic+sense+dedicated+balance+respect = max_u.pts

答案 1 :(得分:0)

您可以通过对内部查询进行排序然后对外部查询进行分组来简化它,而不是进行连接:

select * from (select id, forename, surname, house, (gen + academic + sense + dedicated + balance + respect) as total from Table1 order by house, total desc) x group by house;

这是一个小技巧,因为如果按总计降序分组,它会自动将最大值排在每个房屋组的顶部。然后当你按房子分组时,它将占用每个房子的最大值。

我可以预见的唯一一个你可能需要考虑的问题是,如果两行有相同的最大值?

这是一个SQL小提琴:http://sqlfiddle.com/#!9/25bd8e/14

以上是MySQL解决方案,无需加入。如果您使用的是PostgreSQL,则可以使用:

select distinct on (house) id, forename, surname, house, (gen + academic + sense + dedicated + balance + respect) as total from Table1 order by house, total desc;