2013-07-21 65 views
-4

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

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 

因为他们在最后扳平,并打破僵局,我们看半决赛

+0

除非有一个有限的(小的)的选择在“WIN号码,50 +,70,70 + “范围,这将是相当繁琐的解决。 – Strawberry

+0

在决赛中,'4'与'3'和'2'并列为'1',对吧?因此,竞争对手'2'胜过竞争对手'1',因为他们的半决赛比分高于竞争对手'1'。而且,按照同样的逻辑,竞争对手'4'排在第三位,因为他们的半决赛分数比竞争对手'3'的分数要好!!!?! 2> 1> 4> 3 – Strawberry

+0

对不起,你是可怕的,我犯了一个错误 – user2474683

回答

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 | 
+---------------+-------------+------------------+