Как я могу определить победителей матча из таблицы игр, относящихся к таблице матчей? - PullRequest
0 голосов
/ 06 августа 2011

В базе данных, в которой хранятся турниры, есть реляционная структура для хранения матчей и их игр:

Диаграмма EER

Когда создается матч, вставляется строка матча и несколько строк игры, соответствующих количеству игр в матче. Затем вставляются строки игроков Match_left и Match_right, чтобы связать двух игроков в матче со строкой матча. Когда игрок записан как выигравший игру, строка, относящаяся к соответствующей игре, вставляется в таблицу game_winners. Есть ли способ написать запрос, чтобы определить, кто выиграл матчи из выигранных игр? Возможно, логически это должно быть представление, чтобы я мог в любое время легко присоединить к нему строки таблицы совпадений?

Вот некоторые примеры данных

Я ожидаю, что Фред будет возвращен как победитель match_ID 1, потому что он выиграл 2/3 игр. Я ожидаю, что победитель match_ID 2 будет нулевым, потому что ни один из игроков не выиграл необходимое количество игр для победы (2/3).

Ответы [ 2 ]

0 голосов
/ 08 августа 2011

Давайте посмотрим, правильно ли я понял ваши образцы данных.

SELECT match_id, round_id, COUNT(*) AS game_count
  FROM games
  GROUP BY match_id, round_id

Это дает вам количество игр в каждом матче. Матч - лучший формат, поэтому вам нужно выиграть больше половины игр, чтобы выиграть матч.

SELECT match_id, round_id, player_id, COUNT(*) AS win_count
  FROM game_winners
  GROUP BY match_id, round_id

Это дает вам количество игр, выигранных каждым игроком в каждом матче.

SELECT match_id, round_id, player_id
  FROM game_winners
  GROUP BY match_id, round_id
  HAVING COUNT(*) * 2 > (
    SELECT COUNT(*)
      FROM games
      WHERE games.match_id = game_winners.match_id
      AND games.round_id = game_winners.round_id
  )

Таким образом, один из вариантов - добавить проверку того, что игрок выиграл более половины игр в матче с помощью подзапроса.

SELECT games_won.match_id, games_won.round_id, games_won.player_id
  FROM (
    SELECT match_id, round_id, player_id, COUNT(*) AS win_count
      FROM game_winners
      GROUP BY match_id, round_id
    ) AS games_won
  INNER JOIN (
    SELECT match_id, round_id, COUNT(*) AS game_count
      FROM games
      GROUP BY match_id, round_id
    ) AS all_games
  ON games_won.match_id = game_count.match_id
  AND games_won.round_id = game_count.round_id
  WHERE games_won.win_count * 2 > all_games.game_count

Или, если вы предпочитаете, вы можете сделать это с помощью объединения.

0 голосов
/ 06 августа 2011

Я предполагаю, что победителем матча является игрок, выигравший большинство игр.

Ранжировать игроков в матче просто.

SELECT player_id, COUNT(*) AS game_count
  FROM game_winners
  WHERE match_id = ?
  GROUP BY player_id
  ORDER BY COUNT(*) DESC

Обнаружение победителей более чем в одном матче - маленький обманщик.

SELECT match_id, player_id, COUNT(*) AS game_count
  FROM game_winners
  GROUP BY match_id, player_id

Давайте назовем выше player_wins

SELECT match_id, MAX(game_count) AS match_winner
  FROM player_wins
  GROUP BY match_id

Это дает вам выигрышный счет за каждый матч.

SELECT match_id, player_id
  FROM player_wins
  INNER JOIN (
    SEELCT match_id, MAX(game_count) AS match_winner
    FROM player_wins
    GROUP BY match_id
  ) AS winning_score
  ON player_wins.match_id = winning_score.match_id
  AND player_wins.game_count = winning_score.match_winner

Это дает вам победителя в каждом матче.

...