2010-05-20 3 views
4

У меня есть таблица «игры» для футбольной лиги следующим образом:Сложная футбольная лига Динамический заказ в MySQL?

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

Я не могу понять, как динамически генерировать список идентификаторов команды заказанный Wins (затем указывает на если ПОСС)?

-

У меня есть этот запрос, который хорошо работает, когда у меня есть $ 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? Я также пробовал несколько кратных JOINs с таблицей «team», но они тоже не работали.

Спасибо,

Dan

+0

Это американский футбол, а не футбол? Я британец и футбол == Футбол здесь; o) Я предполагаю, что по счету и отсутствие победы в 3 очка и 1 фишка? Можете ли вы получить ничью или всегда сверхурочно? –

+0

Хорошо ... мне потребовалось около 15 минут, чтобы отправить запрос вместе, но, к сожалению, вы не забиваете трудные вопросы о stackoverflow: D – Simon

+0

@Dave: Сверхурочная работа, внезапная смерть ... все, что нужно, чтобы получить победителя:) –

ответ

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'd вместе, получают выигрыш для каждой страны и гостей. Внешний запрос просто суммирует выигрыши дома и гостей для общего количества выигрышей.

+0

В UNION вам также нужно '(home_score - away_score) как очки' для домашней победы и' (away_score - home_score) в качестве очков' для победы на выезде, а затем 'SUM (all_wins.points)' для предоставления предложения второго порядка. –

+0

@ Дэйв - Я думаю, что ты прав. Я пропустил эту часть его вопроса. Отредактировал мой ответ, чтобы добавить это. –

+0

Также не хватает ОТ игр в двух внутренних запросах SELECT - но этот работает отлично для меня - этот запрос также очень хорошо масштабируется, чтобы добавить много других статистических данных, таких как GP, L, T, \t W%, Pts , для, оч. против и т. д. Мне нравится этот - спасибо. – Dan

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

0

На основании решения Эрика - вот мой последний запрос если у кого-то еще есть аналогичная проблема - спасибо за помощь всем.

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 
Смежные вопросы