2013-07-21 127 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 | 
+---------------+-------------+------------------+