考慮以下數據集...
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 |
+---------------+-------------+------------------+
除非有一個有限的(小的)的選擇在「WIN號碼,50 +,70,70 + 「範圍,這將是相當繁瑣的解決。 – Strawberry
在決賽中,'4'與'3'和'2'並列爲'1',對吧?因此,競爭對手'2'勝過競爭對手'1',因爲他們的半決賽比分高於競爭對手'1'。而且,按照同樣的邏輯,競爭對手'4'排在第三位,因爲他們的半決賽分數比競爭對手'3'的分數要好!!!?! 2> 1> 4> 3 – Strawberry
對不起,你是可怕的,我犯了一個錯誤 – user2474683