2013-07-21 2 views
-4

관련 : MySQL ORDER BY or GROUP BY과 관련하여 더 복잡합니다. 다른 경로에 다양한 점수를 가진 id_competitor가 있습니다. 그들이 마지막에 동점골 때문에MySQL SELECT 및 ORDER BY

id_competitor 
2 
1 
4 
3 

우리가 보는 교착 상태를 깰 : 여기

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 

결과는 다음과 같은 순서로해야한다입니다 준결승전

+0

은 "WIN의 옵션 유한 (작은) 번호가없는 한, 50 +, 70, 70 + "범위, 이것은 해결하기가 다소 지루할 것입니다. – Strawberry

+0

마지막으로, '4'는 '3'과 '2'는 '1'과 연결되어 있습니다. 맞습니까? 따라서 경쟁자 '2'는 경쟁자 '1'보다 더 좋은 반 준결승 점수를 얻었 기 때문에 경쟁자 '1'보다 우승합니다. 그리고 같은 논리에 의해 경쟁자 '4'는 그들의 준결승 스코어가 경쟁자 '3'의 그것보다 낫기 때문에 세 번째가된다! 2> 1> 4> 3 – Strawberry

+0

죄송합니다, 당신은 rigth, 나는 실수를 저질 렀습니다. – 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 | 
+---------------+-------------+------------------+