-4

关于:MySQL ORDER BY 或 GROUP BY,我做得更复杂。我有一个 id_competitor 在不同的路线上有不同的分数。

id_competitor   score    id_route
1                WIN        2
2                WIN        2
3                50+        2
4                50+        2
1                70         1
2                70+        1
3                70         1
4                WIN        1

这是“路线”表

id       name
1      semi-final
2        final

结果应按以下顺序排列:

id_competitor
2
1
4
3

因为他们在决赛中扳平比分并打破僵局,我们看半决赛

4

1 回答 1

0

考虑以下数据集...

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 |
+---------------+-------------+------------------+
于 2013-07-22T08:18:24.850 回答