【问题标题】:calculating the amount of minutes in a query计算查询中的分钟数
【发布时间】:2012-04-20 21:58:52
【问题描述】:

我正在寻找一种方法来计算我的团队中每位球员(或这里只有一名球员)的上场时间。简化的数据库表如下:

matchid    action    minute    player
-------------------------------------
1          subbedin  30        Pele 
2          starter             Pele
2          subbedout 50        Pele
3          subbedin  70        Pele
3          red       80        Pele
4          starter             Pele

我现在对其他统计数据的查询:

$query = mysql_query("SELECT *,
  SUM(CASE WHEN action = 'starter' OR action = 'subbedin' THEN 1 ELSE 0 END) AS games,
  SUM(CASE WHEN action = 'goal' OR action = 'pengoal' THEN 1 ELSE 0 END) AS goals,
  SUM(CASE WHEN action = 'yellow' THEN 1 ELSE 0 END) AS yellows,
  SUM(CASE WHEN action = 'red' THEN 1 ELSE 0 END) AS reds,
  // MINS GOES HERE
FROM league2012
GROUP BY player");

对于每个 matchid,基本计算是

( 90 OR subbedout OR red ) - ( starter OR subbedin )

例如在第二场比赛中

subbedout (50) - starter (0) = 50

最后表格应该是这样的:

player    minutes    goals, cards, etc.
---------------------------------------
Pele      210        ...

过去一个小时我一直在阅读教程,但似乎无法弄清楚如何去做。

【问题讨论】:

    标签: mysql sql count sum


    【解决方案1】:

    我会首先计算每个球员在每场比赛中的上场时间,然后将它们相加得到每个球员的总时间。要将获得的结果与您正在计算的其他统计数据结合起来,我认为没有其他方法只能以相同的方式进行其他统计,即首先是每个球员和比赛,然后是每个球员。这就是我的意思:

    SELECT
      player,
      SUM(games) AS games,
      SUM(goals) AS goals,
      SUM(yellows) AS yellows,
      SUM(reds) AS reds,
      SUM(minutesplayed) AS minutesplayed
    FROM (
      SELECT
        player,
        matchid,
        SUM(CASE WHEN action IN ('starter', 'subbedin') THEN 1 ELSE 0 END) AS games,
        SUM(CASE WHEN action IN ('goal', 'pengoal') THEN 1 ELSE 0 END) AS goals,
        SUM(CASE WHEN action = 'yellow' THEN 1 ELSE 0 END) AS yellows,
        SUM(CASE WHEN action = 'red' THEN 1 ELSE 0 END) AS reds,
        IFNULL(SUM(CASE WHEN action IN ('subbedout', 'red') THEN minute END), 90)
        - IFNULL(SUM(CASE WHEN action = ('subbedin') THEN minute END), 0) AS minutesplayed
      FROM league2012
      GROUP BY
        player,
        matchid
    ) s
    GROUP BY
      player
    

    【讨论】:

      【解决方案2】:
        sum
          (
            case action
              when 'subbedin'  then 90 - minute
              when 'starter'   then 90
              when 'subbedout' then minute - 90
              when 'red'       then minute - 90
            end
          ) as minutes
      

      【讨论】:

      • 非常好!我以为避免双重分组是不可能的,我错了!
      • 比我想象的要简单得多。奇迹般有效。干杯伙伴!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多