Perhatikan kumpulan data berikut...
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 |
+---------------+-------+----------+
Kami ingin mengatur pesaing dengan skor tertinggi pada id_route=2. Dimana skor terikat, hasil dari id_route 1 harus diperhitungkan. Urutan yang benar adalah 2,1,4,3.
Solusi menengah...
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 |
+---------------+-------+----------+---------------+-------+----------+
Solusi lengkap...
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 |
+---------------+-------------+------------------+