虽然我之前已经意识到这个问题有多种形式,但遗憾的是处理这个问题的线程对我的情况没有帮助。
我有一个看起来像这样的表:
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))
谢谢!!!
答案 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;