有条件地根据连接值更新记录

时间:2013-04-04 19:45:59

标签: sql inner-join

我想知道SQL是否可以自己实现这一点,或者我是否应该使用PHP。

(高尔夫)数据库有一个rounds表和一个holes表。 rounds.id存储在该回合的孔记录中。

holes表(在许多其他字段中)firstPuttsecondPuttthirdPutt。这些浮动存储距离和默认值为零。

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

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

因此伪SQL中的更新类似于

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,红色框中数字的总和。

data

在马丁·帕金的回答中,我可以得到一个这样的总和:

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

2 个答案:

答案 0 :(得分: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演示here

答案 1 :(得分: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
)