簡體   English   中英

另一個表的所有行上的行的SQL計算

[英]SQL Calculation of Row on All Rows of another table

我正在計算棒球運動員的相似度得分。 我想做的是根據玩家ID選擇一行,然后對所有其他現有玩家進行計算。

這是一般概念:

得分表

與其他玩家ID相比,我編寫了適用於單個玩家ID的代碼:

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

但是,我需要將單個玩家WHERE b.playerID = 'troutmi01'與所有其他玩家進行比較,而不僅僅是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

有見識嗎?

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中命名的所有值對於每個組都是相同的。服務器可以從每個組中自由選擇任何值,因此,除非它們相同,否則這些值選擇是不確定的。”

在您的情況下,它們是不同的。 玩家的每條記錄都會有所不同,因此需要將其添加到分組依據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM