Нужно руководство для сложного запроса - PullRequest
1 голос
/ 28 декабря 2011

Итак, вот небольшая справка по системе.Пользователь сражается, и победителем является тот, кто выигрывает больше всего раундов.Мне нужна помощь с возможным объединением трех столов.У меня есть таблица user, в которой хранится информация о пользователе.Таблица match, в которой хранится информация о совпадении.Таблица rounds, в которой хранится победитель каждого раунда за матч, поэтому, если в матче 5 раундов, в таблице rounds будет пять строк для этого матча, и будет записываться победитель каждого раунда.

Вотнекоторые примеры данных: Таблица user: (userid является первичным ключом)

userid   username
-----------------
  1       Kevin
  2       Sam
  3       Steve
  4       Matt

Таблица match: (id является первичным ключом. challenger и challenged обавнешние ключи для user.userid)

 id  challenger  challenged  rounds
-----------------------------------
 1      2           3          3
 2      1           2          1
 3      2           3          3
 4      2           4          1

Таблица rounds: (все поля являются первичными ключами. id является внешним ключом для match.id, а winner является внешним ключом для user.userid)

 id  round  winner
------------------
 1    1       2
 1    2       2
 1    3       3
 2    1       1
 3    1       2
 3    2       3
 3    3       2
 4    1       4

Я пытаюсь создать запрос, который выдаст следующие результаты:

winner  won   loser  won  
------------------------
 Sam     2    Steve   1
 Kevin   1    Sam     0
 Sam     2    Steve   1
 Matt    1    Sam     0

Приведенные выше результаты показывают победителя и проигравшего в каждом из матчей.Поле won показывает количество раундов, выигранных за этот матч для победителя и проигравшего соответственно.

Кто-нибудь знает, как я могу построить вышеуказанный запрос?

Ответы [ 3 ]

1 голос
/ 28 декабря 2011
select 
    case when w1 > w2 then u1 else u2 end as winner,
    case when w1 > w2 then w1 else w2 end as won,
    case when w1 > w2 then u2 else u1 end as loser,
    case when w1 > w2 then w2 else w1 end as won
from (
    select m.id, u1.username as u1, u2.username as u2, 
        count(r1.winner) as w1,
        count(r2.winner) as w2
    from match m
    join user u1 on m.challenger = u1.userid
    join user u2 on m.challenged = u2.userid
    join rounds r on r.id = m.id
    left join rounds r1 on r.id = r1.id and r.round = r1.round and r1.winner = u1.userid
    left join rounds r2 on r.id = r2.id and r.round = r2.round and r2.winner = u2.userid
    group by m.id, u1.username, u2.username
) t

Используется ( Проблемы со значениями NULL ):

Агрегатные (сводные) функции, такие как COUNT (), MIN () и SUM () игнорируют значения NULL .

и здесь это преимущество.

0 голосов
/ 28 декабря 2011

Попробуйте это -

SELECT
  IF(won1 >= won2, username1, username2) winner,
  IF(won1 >= won2, won1, won2) won,
  IF(won1 < won2, username1, username2) loser,
  IF(won1 < won2, won1, won2) won
FROM (
  SELECT u1.username username1, u2.username username2, COALESCE(r1.rounds, 0) won1, COALESCE(r2.rounds, 0) won2 FROM `match` m
    JOIN user u1
      ON u1.userid = m.challenger
    JOIN user u2
      ON u2.userid = m.challenged
    LEFT JOIN (SELECT id, COUNT(round) rounds, winner FROM rounds GROUP BY id, winner) r1
      ON r1.id = m.id AND r1.winner = u1.userid
    LEFT JOIN (SELECT id, COUNT(round) rounds, winner FROM rounds GROUP BY id, winner) r2
      ON r2.id = m.id AND r2.winner = u2.userid
  ) t
0 голосов
/ 28 декабря 2011

Попробуйте:

select match_id,
       case when challenger_wins > challenged_wins 
            then challenger_name else challenged_name end) winner,
       case when challenger_wins > challenged_wins 
            then challenger_wins else challenged_wins end) winner_won,
       case when challenger_wins < challenged_wins 
            then challenger_name else challenged_name end) loser,
       case when challenger_wins < challenged_wins 
            then challenger_wins else challenged_wins end) loser_won
from
(select m.id match_id,
        max(case when u.userid = m.challenger 
                 then u.username end) challenger_name,
        sum(case when u.userid = m.challenger 
                 then r.wins else 0 end) challenger_wins,
        max(case when u.userid = m.challenged 
                 then u.username end) challenged_name,
        sum(case when u.userid = m.challenged 
                 then r.wins else 0 end) challenged_wins
 from match m
 join user u on u.userid in (m.challenger, m.challenged)
 left join 
 (select id, winner, count(*) wins
  from round
  group by id, winner) r
 on m.id = r.id and u.userid = r.winner
 group by m.id) v
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...