MySQL Volleyball Турнирная таблица - PullRequest
5 голосов
/ 23 мая 2010

У меня есть таблица базы данных, полная игр по результатам игры, и я хочу знать, могу ли я рассчитать следующее:

  • GP (сыгранные игры)
  • Wins
  • Теряет
  • Очки (2 очка за каждый выигрыш, 1 очко за каждый проигрыш)

Вот моя структура таблицы:

CREATE TABLE `results` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `home_team_id` int(10) unsigned NOT NULL,
  `home_score` int(3) unsigned NOT NULL,
  `visit_team_id` int(10) unsigned NOT NULL,
  `visit_score` int(3) unsigned NOT NULL,
  `tcl_id` int(3) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

И несколько результатов тестирования:

INSERT INTO `results` VALUES(1, 1, 21, 2, 25, 68);
INSERT INTO `results` VALUES(2, 3, 21, 4, 17, 68);
INSERT INTO `results` VALUES(3, 1, 25, 3, 9, 68);
INSERT INTO `results` VALUES(4, 2, 7, 4, 22, 68);
INSERT INTO `results` VALUES(5, 1, 19, 4, 20, 68);
INSERT INTO `results` VALUES(6, 2, 24, 3, 26, 68);

Вот как будет выглядеть финальная таблица примерно так (результаты не совсем точны):

+-------------------+----+------+-------+--------+
| Team Name         | GP | Wins | Loses | Points |
+-------------------+----+------+-------+--------+
| Spikers           |  4 |    4 |     0 |      8 |
| Leapers           |  4 |    2 |     2 |      6 |
| Ground Control    |  4 |    1 |     3 |      5 |
| Touch Guys        |  4 |    0 |     4 |      4 |
+-------------------+----+------+-------+--------+

Необходимо добавить предложение WHERE для

tcl_id
примерно так:

WHERE results.tcl_id = 68

Заранее спасибо.

1 Ответ

8 голосов
/ 24 мая 2010

Это должно делать то, что вы хотите:

SELECT
    team_id,
    COUNT(*) AS GP,
    SUM(is_win) AS Wins,
    SUM(NOT is_win) AS Losses,
    2 * SUM(is_win) + SUM(NOT is_win) AS Points
FROM
(
    SELECT
        home_team_id AS team_id,
        home_score > visit_score AS is_win
    FROM results
    WHERE tcl_id = 68
    UNION ALL
    SELECT
        visit_team_id AS team_id,
        home_score < visit_score AS is_win
    FROM results
    WHERE tcl_id = 68
) T1
GROUP BY team_id
ORDER BY Points DESC

Вывод данных вашего примера:

4, 3, 2, 1, 5
3, 3, 2, 1, 5
1, 3, 1, 2, 4
2, 3, 1, 2, 4

Примечания:

  • Данные вашего примера не соответствуют ожидаемому результату - в ваших тестовых данных сыграно только 6 игр, а ожидаемый результат - 8 игр. Вот почему мой вывод отличается от вашего.
  • Вы не предоставили таблицу для получения названий команд из идентификаторов команд. Просто присоединитесь к таблице с именами команд, чтобы получить результат в нужном формате.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...