算上每场比赛得分更多的球员

时间:2015-06-15 21:55:58

标签: mysql

我正在尝试比较两支在同一支球队打过球的足球运动员,我试图知道谁在他们一起比赛的每场比赛中得分更多,并计算一名球员在比赛中得分更多的次数。每场比赛。例如:

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

最终结果应该是Messi = 2,因为他在2场比赛中打入更多进球。

我有下一个查询来查找与我选择的玩家共享相同团队和游戏的玩家(本例中为Messi):

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来比较两个玩家。可能这是一个愚蠢的问题,答案很简单,但我已经花了几个小时研究它并没有想到任何事情。

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

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)."';

答案 1 :(得分:0)

虽然本身就是一个奇怪的查询,但请看看这是否有帮助。你正处于良好的轨道上,正如你所说,这是另一个TEAM-MATE在同一场比赛中进行的比赛...所以你需要一个基于案例的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子句具有“Messi”字符串的条件,而JOIN子句只是说播放器1(Messi)对于播放器2来说是不一样的。

分组不包括每个游戏,因为您想根据玩家所玩的游戏总数...

最后,包括最终“仅保留这些记录”,其中玩家1目标的总和超过玩家2目标的总和。

如果你删除了HAVING条款,你会看到你的结果是梅西比玩家内马尔有2个游戏更高的目标和1个游戏的LESS目标

比较不考虑“=”,因为两个玩家都没有比其他玩家更多的积分...所以如果这样的游戏中两个人得分都是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。如果网络游戏是积极的,那么玩家1是更好的玩家,= 0平局,负面是其他玩家更好。