Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在两个条件下获得第二高的值_Mysql - Fatal编程技术网

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