2013-04-04 3 views
0

Мне интересно, сможет ли SQL выполнить это самостоятельно или использовать PHP.Условно обновить запись на основе значений объединения

База данных (гольф) содержит таблицу 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, сумма чисел в красных квадратах.

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

Вы можете попробовать следующее, который, кажется, чтобы предложить то, что вы ищете:

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.

+0

Спасибо за ответ! Я очень рад узнать о CASE в SQL. Я не знал. Ваш ответ близок, но он не суммирует несколько строк записей «отверстий», где h.round = r.id. Я добавил иллюстративный пример некоторых данных на мой вопрос. В примере ваш запрос получает значение 12, но сумма равна 145. – jerrygarciuh

+0

Получил его сортировку. Спасибо, что преподал мне о CASE! – jerrygarciuh

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 
) 
Смежные вопросы