MySQL объединяет три таблицы и средний - PullRequest
1 голос
/ 13 февраля 2011

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

Хотя я не совсем уверен.

У меня есть три таблицы: teams, matches и scored.

Таблица teams содержит список номеров команд и соответствующие названия команд.

Таблица matches содержит список зарегистрированных результатов матчей (по одной строке на команду на матч) с соответствующим номером команды.

Таблица scored содержит список всей информации о каждом счете, набранном командой, и соответствующий идентификатор результата матча.

┌────────────┐
| TEAMS      |
├────────────┤
│ teamnumber |
│ teamname   |
└────────────┘

┌───────────────┐
| MATCHES       |
├───────────────┤
│ teamnumber    |
│ matchresultid |
└───────────────┘

┌───────────────┐
| SCORED        |
├───────────────┤
│ matchscoredid |
│ matchresultid |
└───────────────┘

Учитывая номер команды, мне нужно получить среднее количество строк в scored на matchresultid. Как бы я это сделал?

Ответы [ 4 ]

3 голосов
/ 13 февраля 2011

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

select 
      t.teamnumber,
      t.teamname,
      avg( s.totalpoints ) TeamAvgPoints
   from 
      teams t
         join matches m
            on t.teamnumber = m.teamnumber
            join scored s
               on m.matchresultid = s.matchresultid
   where 
      t.teamnumber = SomeValue

Если вы хотите сравнить средние значения по ВСЕМ командам, игнорируйте предложение WHERE и просто создайте группу по ...

   group by
      t.teamnumber, 
      t.teamname

Если в забитой таблице есть несколько строк на игру, то для каждой игры необходимо предварительно выполнить агрегацию, чтобы сначала набрать общее количество очков, ТОГДА получить среднее ... что-то вроде

select
      PreQuery.TeamNumber,
      PreQuery.TeamName,
      avg( ifnull( PreQuery.MatchTotalPoints, 0 ) ) AvgPerGame
   from 
      ( select 
            t.teamnumber,
            t.teamname,
            m.matchresultid,
            count(*) MatchTotalPoints
         from 
            teams t
               left join matches m
                  on t.teamnumber = m.teamnumber
                  left join scored s
                     on m.matchresultid = s.matchresultid
         where 
            t.teamnumber IN( SomeValue, AnotherValue, MoreValues, EtcValue )
         group by
            t.teamnumber,
            t.teamname,
            m.matchresultid ) PreQuery
   group by 
       PreQuery.TeamNumber,
       PreQuery.TeamName

В ЭТОЙ версии запроса, если вы хотите сравнить все команды, удалите внутреннее предложение WHERE для конкретной команды и примените группу к запросу OUTER по номеру команды и имени команды.

Чтобы получить ваш дополнительный квалификатор для всего списка, я изменил на ЛЕВЫЕ соединения и закончил с IFNULL () для среднего ...

1 голос
/ 13 февраля 2011

Вам нужно количество баллов или средний балл?Если вам нужен средний балл, вам нужно заменить «count» на «avg»

SELECT s.matchresultid, COUNT(s.matchscoredid) 
  FROM matches m INNER JOIN scored s ON m.matchresultid = s.matchresultid
 WHERE m.teamnumber = <team>
GROUP BY s.matchresultid
0 голосов
/ 13 февраля 2011
SELECT a.teamname team, b.matchresultid match, COUNT(c.matchscoredid) scores 
FROM teams a, matches b, scored c 
WHERE a.teamnumber = b.teamnumber AND b.matchresultid = c.matchresultid;

Это должно вернуть количество очков для каждой команды за матч.

0 голосов
/ 13 февраля 2011

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

SELECT s.matchresultid, count(*) 
FROM scored s
JOIN matches m
ON m.matchresultid = s.matchresultid
WHERE m.teamnumber = your_team_number
GROUP BY s.matchresultid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...