2010-05-20 52 views
4

我有一個足球聯賽表「遊戲」如下:MySQL中的複雜足球聯盟動態排序?

date home_team_id away_team_id home_score  away_score 
-   1     2    6    21 
-   3     1    7    19 

我無法弄清楚如何動態地生成由勝利有序的團隊的ID列表(然後如果POSS點)?

-

我有這個疑問時,我有一個$ TEAM_ID但事業的話,我只能做1隊的時間,並且不允許在查詢級別排序工作正常

((SELECT COUNT(*) FROM `games` WHERE ((`home_score` > `away_score`) AND `home_team_id` = '.$team_id.')) + 
(SELECT COUNT(*) FROM `games` WHERE ((`home_score` < `away_score`) AND `away_team_id` = '.$team_id.'))) AS `wins` 

我不知道我是否可以使用某種形式的GROUP,或者mySQL可以知道$ team_id本身? 我也嘗試了一些與'團隊'表的多個JOIN,但他們也沒有工作。

感謝,

+0

這是美式足球而不是足球吧?我在這裏是英式足球和足球==足球; o)我是這麼認爲的,並且缺乏3分和1分的平局?你甚至可以得到平局還是總是有加班? – 2010-05-20 17:50:22

+0

好的......我花了大約15分鐘把查詢放在一起,但不幸的是,你不能在計算器上對難題進行評分:D – Simon 2010-05-20 17:54:08

+0

@Dave:加班,突然死亡......無論如何獲得勝利者: ) – 2010-05-20 17:56:40

回答

2

也許這是你在找什麼呢?

SELECT all_wins.team_id, SUM(all_wins.wins) 
FROM (
    SELECT 
    home_team_id as team_id, 
    SUM(IF(home_score > away_score,1,0)) as wins, 
    SUM(home_score - away_score) as points 
    FROM games 
    GROUP BY home_team_id 
    UNION ALL 
    SELECT 
    away_team_id as team_id, 
    SUM(IF(away_score > home_score,1,0)) as wins, 
    SUM(away_score - home_score) as points 
    FROM games 
    GROUP BY away_team_id 
) all_wins 
GROUP BY all_wins.team_id 
ORDER BY SUM(all_wins.wins), SUM(all_wins.points) 

ETA:原來的答案並不完整,我認爲這應該會更好。

UNION在一起的內部兩個查詢獲得每個團隊的主客場勝利。外部查詢簡單地總結了主勝客的總勝率。

+0

在UNION中,你還需要'(home_score - away_score)作爲主場勝利的積分和'(away_score - home_score)作爲客場勝利的點數,然後是'SUM(all_wins.points)'給出一個第二個子句? – 2010-05-20 17:43:48

+0

@Dave - 我認爲你是對的。我錯過了他的部分問題。編輯我的答案補充說。 – 2010-05-20 20:17:17

+0

它也錯過了 從兩個內部SELECT查詢中的遊戲 - 但這一個對我來說是完美的工作 - 這個查詢也很好地擴展到增加很多其他的統計數據,如GP,L,T,\t W%,Pts 。爲,分。反對等 我喜歡這個 - 謝謝。 – Dan 2010-05-20 22:19:50

5

讓我們做一步一步來:

家選擇在家裏贏得比賽和比分:

SELECT COUNT(*) as wins, SUM(G.home_score) as score FROM games G WHERE 
     G.team_id = T.team_id #See 3. query and you'll understand 
     G.home_score > away_score 

讓我們把這個結果HOME_GAMES。

選擇贏得比賽和客場比賽的比分:

SELECT COUNT(*) as wins, SUM(G.away_score) as score FROM games G 
WHERE 
    G.team_id = T.team_id #See 3. query and you'll understand 
    G.away_score > G.home_score 

讓我們把這個結果AWAY_GAMES。

選擇總贏得比賽,總比分:

SELECT (A.wins + H.wins) AS total_wins, (A.score + H.score) AS total_score FROM 
    (AWAY_GAMES) AS A, (HOME_GAMES) AS H, teams T 
    ORDER BY total_wins, total_score 

==>代AWAY_GAMES和HOME_GAMES放在一起:

SELECT (A.wins + H.wins) AS total_wins, (A.score + H.score) AS total_score FROM 
    (SELECT COUNT(*) as wins, SUM(G.away_score) as score FROM games G 
    WHERE 
    G.team_id = T.team_id #See 3. and you'll understand 
    G.away_score > G.home_score) AS A, 

    (SELECT COUNT(*) as wins, SUM(G.home_score) as score FROM games G 
    WHERE 
     G.team_id = T.team_id #See 3. and you'll understand 
     G.home_score > away_score) AS H, 

    teams T 
    ORDER BY total_wins, total_score 
+0

這是一個了不起的查詢 - 謝謝,仍然搞清楚你有什麼在這裏。這真的是非常困難,然後最初出現呃! – Dan 2010-05-20 22:11:51

0

基於Eric的解決方案 - 這是我最後的查詢如果其他人有類似的問題 - 謝謝大家的幫助。

SELECT `teams`.`id`, `teams`.`name`, 
     SUM(`all_wins`.`gp`) AS `gp`, 
     SUM(`all_wins`.`w`) AS `w`, SUM(`all_wins`.`l`) AS `l`, SUM(`all_wins`.`t`) AS `t`, 
     SUM(`all_wins`.`ptf`) AS `ptf`, SUM(`all_wins`.`pta`) AS `pta` 
FROM (
    SELECT 
    `home_team_id` as `team_id`, 
    COUNT(`home_score`) AS `gp`, 
    SUM(IF(`home_score` > `away_score`,1,0)) as `w`, 
    SUM(IF(`home_score` < `away_score`,1,0)) as `l`, 
    SUM(IF(`home_score` = `away_score`,1,0)) as `t`, 
    SUM(IFNULL(`home_score`,0)) as `ptf`, 
    SUM(IFNULL(`away_score`,0)) as `pta` 
    FROM `games`  
    GROUP BY `home_team_id` 
    UNION ALL 
    SELECT 
    `away_team_id` as `team_id`, 
    COUNT(`home_score`) AS `gp`, 
    SUM(IF(`away_score` > `home_score`,1,0)) as `w`, 
    SUM(IF(`away_score` < `home_score`,1,0)) as `l`, 
    SUM(IF(`away_score` = `home_score`,1,0)) as `t`, 
    SUM(IFNULL(`away_score`,0)) as `ptf`, 
    SUM(IFNULL(`home_score`,0)) as `pta` 
    FROM `games` 

    GROUP BY `away_team_id` 
) `all_wins` 
LEFT JOIN `teams` ON `all_wins`.`team_id` = `teams`.`id` 
GROUP BY `all_wins`.`team_id` 
ORDER BY SUM(`all_wins`.`w`) DESC, SUM(`all_wins`.`ptf`) DESC