Mysql 在两个条件下获得第二高的值
这是我的桌子:Mysql 在两个条件下获得第二高的值,mysql,Mysql,这是我的桌子: +--------+-------+--------+--------+ | player | points| score1 | score2 | +--------+-------+--------+--------+ | 1 | 12 | 9 | 1 | | 2 | 12 | 14 | 2 | | 3 | 10 | 12 | 3 | | 4 | 9 |
+--------+-------+--------+--------+
| player | points| score1 | score2 |
+--------+-------+--------+--------+
| 1 | 12 | 9 | 1 |
| 2 | 12 | 14 | 2 |
| 3 | 10 | 12 | 3 |
| 4 | 9 | 10 | 4 |
| 5 | 8 | 10 | 4 |
+--------+-------+--------+--------+
为了获得第二高的值,我使用了以下查询:
SELECT player,points FROM players
WHERE points= (SELECT DISTINCT(points) FROM players as p1
WHERE (SELECT COUNT(DISTINCT(points))=2 FROM players as p2
WHERE p1.points<= p2.points)) ORDER BY player
它工作得很好。但现在我想得到的是两个条件:
条件1:点描述
条件2:得分1-2描述
此查询可以很好地获取具有第二高值检查点和分数1的玩家:
SELECT player,points FROM players
WHERE points= (SELECT DISTINCT(points) FROM players as p1
WHERE (SELECT COUNT(DISTINCT(points))=2 FROM players as p2
WHERE p1.points<= p2.points))
AND
WHERE score1= (SELECT DISTINCT(score1) FROM players as p1
WHERE (SELECT COUNT(DISTINCT(score1))=2 FROM players as p2
WHERE p1.score1<= p2.score1))
ORDER BY player
如何使用两个条件points DESC和score1-score2 DESC获得第二高值的玩家?此查询将满足您的要求。它将玩家加入自身,寻找第二个表中排名高于第一个表的所有玩家。在这种情况下,排名首先基于分数,然后在分数相等的情况下基于分数1和分数2之间的差值。排名第二的玩家是指有一个级别高于他们的玩家:
SELECT p1.*
FROM players p1
JOIN players p2 ON p2.points > p1.points
OR p2.points = p1.points AND (p2.score1 - p2.score2) > (p1.score1 - p1.score2)
GROUP BY p1.player
HAVING COUNT(p2.player) = 1
输出:
player points score1 score2
1 12 9 1
player points score1 score2
2 12 14 2
您也可以以类似的方式编写原始查询,使用p2.player你使用的是什么版本的MySQL?我使用的是5.6.40版本,那么答案是玩家1的最高分数相同,但分数差低于玩家2吗?嗨,尼克,是的。你是right@SunZ别担心。我认为您应该会发现这比在WHERE子句中使用多个子查询的性能更好。此外,也很容易添加更多的打破平局的条件
player points score1 score2
2 12 14 2