我正计算棒球运动员的相似度得分。我要做的是根据playerID选择一行,然后对所有其他现有玩家进行计算。
这是一般概念:
我编写的代码适用于单个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
有什么见解?
答案 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中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。 "
在你的情况下它们不一样。每个记录的播放器都不同,因此需要将其添加到组中。