0

我想知道 SQL 是否可以自己完成此任务,或者我是否应该使用 PHP。

(golf) 数据库有一个rounds表和一个holes表。 rounds.id存储在该轮的洞记录中。

holes表有(在许多其他领域中)firstPutt, secondPutt, thirdPutt. 这些是存储距离并默认为零的浮点数。

我的雇主想要做的是在圆桌中存储该轮所有洞的最后一个推杆长度的总和。

我意识到,如果我有一个putts表引用holes.id,这将是一个更好的结构,但目前这是不可能的。

所以pseudoSQL中的更新会是这样的

UPDATE holes h, rounds r
SET r.sumOfLastPutts = (
SELECT thirdPutt if thirdPutt is not 0 
  OR secondPutt if secondPutt is not zero AND thirdPutt is zero 
  OR firstPutt if firstPutt is not zero AND secondPutt is zero)
) WHERE h.round = rounds.id

这可能只使用 SQL 吗?

在此示例中,该轮的数字为 145,即红色框中数字的总和。

数据

离开马丁帕金的回答,我可以得到这样的单轮总和:

SELECT 
SUM(
  CASE
    WHEN h.thirdPutt != 0 THEN h.thirdPutt
    WHEN h.secondPutt != 0 THEN h.secondPutt
    WHEN h.firstPutt != 0 THEN h.firstPutt
  END
)
FROM holes h
WHERE h.round = 3044
4

2 回答 2

2

您可以尝试以下方法,这似乎提供了您正在寻找的东西:

UPDATE rounds r, holes h
  SET r.sumOfLastPutts =
    CASE
      WHEN h.thirdPutt != 0 THEN h.thirdPutt
      WHEN h.secondPutt != 0 THEN h.secondPutt
      WHEN h.firstPutt != 0 THEN h.firstPutt
    END
  WHERE h.round = r.id;

这里有一个 SQLFiddle 演示。

于 2013-04-04T19:57:42.883 回答
0

这可以完成工作:

UPDATE rounds r
  SET r.totalPuttDistance = (
    SELECT 
      SUM(
        CASE
          WHEN h.thirdPutt != 0 THEN h.thirdPutt
          WHEN h.secondPutt != 0 THEN h.secondPutt
          WHEN h.firstPutt != 0 THEN h.firstPutt
        END
       )
    FROM holes h
    WHERE h.round = r.id
)
于 2013-04-04T21:18:22.693 回答