【问题标题】:Count who scored more goals per match计算每场比赛的进球数
【发布时间】:2015-06-15 21:55:57
【问题描述】:

我想比较在同一支球队踢球的两名足球运动员,我想知道谁在他们一起踢的每场比赛中进球更多,并计算一名球员在比赛中比另一名球员进球更多的次数每场比赛。例如:

  • 第 1 场:梅西 2 球 - 内马尔 0 球
  • 第 2 场:梅西 2 球 - 内马尔 3 球
  • 第 3 场:梅西 4 球 - 内马尔 1 球

最终的结果应该是梅西=2,因为他在2场比赛中进了更多的球。

我有下一个查询来查找与我选择的球员(本例中为梅西)共享同一支球队和比赛的球员:

SELECT S1.Team, S1.Game, S1.Player, S2.Team, S2.Game, S2.Player 
FROM Mytable S1 
INNER JOIN Mytable S2 ON S1.Team = S2.Team AND 
S1.Game= S2.Game AND 
S1.Player LIKE '".mysql_real_escape_string($Messiinthiscase)."' 
AND S2.Player <> '".mysql_real_escape_string($Messiinthiscase)."';

Mytable 是这样的:

Player | Team | Game | Goals
-------------------------------
Messi      A      G1     2
Neymar     A      G1     0
Messi      A      G2     2
Neymar     A      G2     3
Messi      A      G3     4
Neymar     A      G3     1

但我不知道如何实现 COUNT 来比较两个玩家。可能这是一个简单的答案很愚蠢的问题,但我已经花了好几个小时来解决这个问题,但我什么都没想到。

感谢大家的帮助

【问题讨论】:

    标签: mysql


    【解决方案1】:

    虽然本身是一个奇怪的查询,但让我们看看这是否有帮助。你在一个很好的轨道上,正如你所说,这是另一个在同一场比赛中比赛的队友......所以你需要一个基于案例/当你的“梅西”球员和其他人分组时的 SUM()播放并得分...然后应用HAVING。所以,如果梅西有5个队友,应该有4个可能的回报

    梅西 vs 队友 1 梅西 vs 队友 2 梅西 vs 队友 3 梅西VS队友4

    其中,梅西的得分可能比队友 1、2 和 4 多,但低于 3。

    SELECT
          S1.Team, 
          S1.Player, 
          S2.Player,
          sum( case when s1.goals > s2.goals then 1 else 0 end ) as Player1Higher,
          sum( case when s1.goals < s2.goals then 1 else 0 end ) as Player1Lower
       FROM 
          Mytable S1 
             INNER JOIN Mytable S2
                ON S1.Team = S2.Team 
               AND S1.Game = S2.Game 
               AND NOT S1.Player = S2.Player
       WHERE
          S1.Player LIKE '".mysql_real_escape_string($Messiinthiscase)."'
       GROUP BY
          S1.Team,
          S1.Player,
          S2.Player
       HAVING 
          sum( case when s1.goals > s2.goals then 1 else 0 end ) >
          sum( case when s1.goals < s2.goals then 1 else 0 end ) 
    

    请注意,WHERE 子句具有您对“梅西”字符串的标准,而 JOIN 子句只是说球员 1(梅西)与球员 2 不同。

    分组依据不包括每个游戏,因为您希望根据玩家都玩过的游戏来计算总数...

    最后包含最后的“只保留这些记录”,其中球员 1 进球的总和超过球员 2 进球的总和。

    如果您删除 HAVING 子句,您会看到与球员内马尔相比,梅西的进球数高 2 场,进球少 1 场

    比较不考虑“=”,因为没有一个玩家比另一个玩家得分更多......所以如果这样的游戏中两个人都得 2 分,那么两个人都不会被认为是得分较高的玩家。

    比较可以通过做进一步简化

      sum( case when s1.goals = s2.goals then 0
                when s1.goals > s2.goals then 1 else -1 end ) as NetGames
    

    所以,同样,如果比分是平的,那么没有人会更好。如果 s1 目标更高,+1,否则其他玩家更高,-1。如果 Net Games 是正数,则玩家 1 是更好的玩家,= 0 平局,负数是其他玩家更好。

    【讨论】:

    • 惊人的答案和惊人的解决方案!!!!...你成就了我的一天,它工作得很好。我最深切的感谢
    • @ZaraMartin,我刚刚注意到一个糟糕并更改了它...分组应该是 S1.Player,S2.Player...我最初将它们都作为 S1...跨度>
    • 是的,我知道你打错了那部分,因为重复同一个播放器没有任何意义......但无论如何,一个很好的答案......再次感谢
    【解决方案2】:
    SELECT S1.Team, S1.Game, S1.Player, S2.Team, S2.Game, S2.Player, CASE WHEN S1.goals < S2.goals THEN S2.goals - S1.goals WHEN S2.goals < S1.goals THEN S1.goals - S2.goals ELSE 0 END as difference 
    FROM Mytable S1 
    INNER JOIN Mytable S2 ON S1.Team = S2.Team AND 
    S1.Game= S2.Game AND 
    S1.Player LIKE '".mysql_real_escape_string($Messiinthiscase)."' 
    AND S2.Player <> '".mysql_real_escape_string($Messiinthiscase)."';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多