MYSQL SUM для двух нескольких столбцов в разных таблицах - PullRequest
2 голосов
/ 07 ноября 2011

Я объясню сценарий, формула 1, для каждой команды в формуле 1 есть 2 гонщика, 24 гонщика, 12 команд.Мне нужно получить очки, рассчитанные ниже, из таблицы team_stats, но получить полюсы, подиумы и победы из таблицы driver_stats, поэтому Себастьон Феттель и Марк Уэббер оба являются членами команды team_id = '3', что является красным быком.Мне нужно получить полюса, подиумы, победы из таблицы driver_stats для каждого из них и суммировать их вместе, но рассчитать баллы для команды, которые есть в таблице team_stats.Я столкнулся с тем, что он рассчитывает командные очки дважды для каждого team_id, потому что в таблице driver_stats есть два драйвера, где мне просто нужно сделать SUM для очков в таблице team_stats только для каждого team_id, который водителиявляются членами.

DRIVER_STATS TABLE 
| track_id | drivers_id | qual_pos | race_pos | overtakes | points

TEAM STATS TABLE
| track_id | team_id | points |

DRIVERS TABLE
| driver_id | drivername | team_id |

TEAM TABLE COLUMNS 
|team_id | teamname | value

Теперь ниже это работает, но подсчитывает баллы из таблицы driver_stats, оно суммирует значения для полюсов обгонов и т. Д., Правильно добавляя два драйвера вместе.Вместо этого мне нужно СУММИТЬ балльную часть для каждого team_id в таблице team_stats, в этой таблице есть только один случай для каждых 2 водителей в таблице driver_stats, от 2 водителей до 1 команды.

    SELECT t.teamname,
         t.value,
         SUM(IF(s.qual_pos = '1', 1,0)) AS poles,
         SUM(IF(s.race_pos <= '3', 1,0)) AS podiums,
         SUM(IF(s.race_pos = '1', 1,0)) AS victories,
         SUM(s.overtakes) AS overtakes,
         SUM(CASE
           WHEN s.track_id = (SELECT MAX(track_id) FROM driver_stats) THEN
             points
           ELSE
             0
         End) AS lastracepoints,
         SUM(points) AS points 

   FROM         drivers d
   INNER JOIN  driver_stats s
   ON         d.drivers_id = s.drivers_id
   AND         d.team_id = 3
   LEFT JOIN  teams t
   ON         d.team_id = t.team_id
   GROUP BY
   t.teamname

Этоэто запрос, который я тоже изменил, чтобы попытаться его достичь.

       SELECT t.teamname,
         t.value,
         SUM(IF(s.qual_pos = '1', 1,0)) AS poles,
         SUM(IF(s.race_pos <= '3', 1,0)) AS podiums,
         SUM(IF(s.race_pos = '1', 1,0)) AS victories,
         SUM(s.overtakes) AS overtakes,
         SUM(CASE
           WHEN ts.track_id = (SELECT MAX(track_id) FROM team_stats) THEN
             ts.points
           ELSE
             0
         End) AS lastracepoints,
         SUM(ts.points) AS points 

   FROM          drivers d
   INNER JOIN  driver_stats s
   ON          d.drivers_id = s.drivers_id
   AND         d.team_id = 3
   LEFT JOIN  teams t
   ON          d.team_id = t.team_id
   INNER JOIN  team_stats ts
   ON          ts.team_id = d.team_id
   GROUP BY
   t.teamname

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

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 12 декабря 2013

Если ts.team_id не присоединится к t.team_id и не заглянет во ВНУТРЕННЕЕ СОЕДИНЕНИЕ, вам может быть лучше с другим ЛЕВЫМ СОЕДИНЕНИЕМ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...