SQL计算另一个表的所有行上的行

时间:2015-02-25 21:10:00

标签: mysql sql

我正计算棒球运动员的相似度得分。我要做的是根据playerID选择一行,然后对所有其他现有玩家进行计算。

这是一般概念:

Tables to Score

我编写的代码适用于单个playerID而不是另一个playerID:

SELECT p.player, pc.player, 
     1000 - (Abs((p.G-pc.G)/20) + 
     Abs((p.AB-pc.AB)/75) + 
     Abs((p.R-pc.R)/10) +
     Abs((p.H-pc.H)/15) +
     Abs((p.D-pc.D)/5) +
     Abs((p.T-pc.T)/4) +
     Abs((p.HR-pc.HR)/2) +
     Abs((p.RBI-pc.RBI)/10) +
     Abs((p.BB-pc.BB)/25) +
     Abs((p.SO-pc.SO)/150) +
     Abs((p.SB-pc.SB)/20) +
     Abs((p.AVG-pc.AVG)*1000) +
     Abs((p.SLG-pc.SLG)*2000)) AS SIMscore

FROM(SELECT CONCAT(m.nameFirst, ' ', m.nameLast) AS player, 
     Sum(b.G) AS G, 
     Sum(b.AB) AS AB, 
     Sum(b.R) AS R, 
     Sum(b.H) AS H,
     Sum(b.2b) AS D, 
     Sum(b.3b) AS T, 
     Sum(b.HR) AS HR, 
     Sum(b.RBI) AS RBI, 
     Sum(b.BB) AS BB,     
     Sum(b.SO) AS SO, b.SB AS SB, 
     Sum(b.H)/Sum(b.AB) AS AVG,
     (Sum(b.H)+Sum(b.2b)*2+Sum(b.3B)*3+Sum(b.HR)*4)/Sum(b.AB) AS SLG
  FROM Batting b
  JOIN Master m
  ON b.playerID = m.playerID
  WHERE b.playerID = 'griffke02') AS p,
  (SELECT CONCAT(m.nameFirst, ' ', m.nameLast) AS player, 
      Sum(b.G) AS G, 
      Sum(b.AB) AS AB, 
      Sum(b.R) AS R, 
      Sum(b.H) AS H,
      Sum(b.2b) AS D, 
      Sum(b.3b) AS T, 
      Sum(b.HR) AS HR, 
      Sum(b.RBI) AS RBI, 
      Sum(b.BB) AS BB, 
      Sum(b.SO) AS SO, 
      Sum(b.SB) AS SB, 
      Sum(b.H)/Sum(b.AB) AS AVG,
      (Sum(b.H)+Sum(b.2b)*2+Sum(b.3B)*3+Sum(b.HR)*4)/Sum(b.AB) AS SLG
  FROM Batting b
  JOIN Master m
  ON b.playerID = m.playerID
  WHERE b.playerID = 'troutmi01') AS pc

但是,我需要它将单个playerID与所有其他玩家进行比较而不仅仅是WHERE b.playerID = 'troutmi01'

SELECT CONCAT(m.nameFirst, ' ', m.nameLast) AS player, 
      Sum(b.G) AS G, 
      Sum(b.AB) AS AB, 
      Sum(b.R) AS R, 
      Sum(b.H) AS H,
      Sum(b.2b) AS D, 
      Sum(b.3b) AS T, 
      Sum(b.HR) AS HR, 
      Sum(b.RBI) AS RBI, 
      Sum(b.BB) AS BB, 
      Sum(b.SO) AS SO, 
      Sum(b.SB) AS SB, 
      Sum(b.H)/Sum(b.AB) AS AVG,
      (Sum(b.H)+Sum(b.2b)*2+Sum(b.3B)*3+Sum(b.HR)*4)/Sum(b.AB) AS SLG
  FROM Batting b
  JOIN Master m
  ON b.playerID = m.playerID

有什么见解?

1 个答案:

答案 0 :(得分:1)

SELECT CONCAT(m.nameFirst, ' ', m.nameLast) AS player, 
      Sum(b.G) AS G, 
      Sum(b.AB) AS AB, 
      Sum(b.R) AS R, 
      Sum(b.H) AS H,
      Sum(b.2b) AS D, 
      Sum(b.3b) AS T, 
      Sum(b.HR) AS HR, 
      Sum(b.RBI) AS RBI, 
      Sum(b.BB) AS BB, 
      Sum(b.SO) AS SO, 
      Sum(b.SB) AS SB, 
      Sum(b.H)/Sum(b.AB) AS AVG,
      (Sum(b.H)+Sum(b.2b)*2+Sum(b.3B)*3+Sum(b.HR)*4)/Sum(b.AB) AS SLG
  FROM Batting b
  JOIN Master m
  ON b.playerID = m.playerID
GROUP BY CONCAT(m.nameFirst, ' ', m.nameLast)

按...添加组

至于为何需要了解Mysql Group By Extensions

具体做法是: "但是,当GROUP BY中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。 "

在你的情况下它们不一样。每个记录的播放器都不同,因此需要将其添加到组中。