निम्नलिखित डेटा सेट पर विचार करें...
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 |
+---------------+-------------+------------------+