考虑以下数据集...
DROP TABLE IF EXISTS results;
CREATE TABLE results
(id_competitor INT NOT NULL
,score INT NOT NULL
,id_route INT NOT NULL
,PRIMARY KEY(id_competitor,id_route)
);
INSERT INTO results VALUES
(1,100,2),
(2,100,2),
(3,60,2),
(4 ,60,2),
(1,70,1),
(2,80,1),
(3,70,1),
(4,100,1);
SELECT * FROM results;
+---------------+-------+----------+
| id_competitor | score | id_route |
+---------------+-------+----------+
| 1 | 70 | 1 |
| 1 | 100 | 2 |
| 2 | 80 | 1 |
| 2 | 100 | 2 |
| 3 | 70 | 1 |
| 3 | 60 | 2 |
| 4 | 100 | 1 |
| 4 | 60 | 2 |
+---------------+-------+----------+
我们想按照 id_route=2 上的最高分来排列竞争对手。在分数相同的情况下,应考虑 id_route 1 的结果。正确的顺序应该是 2,1,4,3。
中间解决方案...
SELECT *
FROM results x
JOIN results y
ON y.id_competitor = x.id_competitor
AND y.id_route = 1
WHERE x.id_route = 2;
+---------------+-------+----------+---------------+-------+----------+
| id_competitor | score | id_route | id_competitor | score | id_route |
+---------------+-------+----------+---------------+-------+----------+
| 1 | 100 | 2 | 1 | 70 | 1 |
| 2 | 100 | 2 | 2 | 80 | 1 |
| 3 | 60 | 2 | 3 | 70 | 1 |
| 4 | 60 | 2 | 4 | 100 | 1 |
+---------------+-------+----------+---------------+-------+----------+
完整的解决方案...
SELECT x.id_competitor
, x.score final_score
, y.score semi_final_score
FROM results x
JOIN results y
ON y.id_competitor = x.id_competitor
AND y.id_route = 1
WHERE x.id_route = 2
ORDER
BY final_score DESC
, semi_final_score DESC;
+---------------+-------------+------------------+
| id_competitor | final_score | semi_final_score |
+---------------+-------------+------------------+
| 2 | 100 | 80 |
| 1 | 100 | 70 |
| 4 | 60 | 100 |
| 3 | 60 | 70 |
+---------------+-------------+------------------+