2013-09-29 6 views
1

Я надеялся, что следующий запрос обновит все строки, где updated=0, но это не так. Он делает только одно обновление. Вы можете понять, почему?Почему это утверждение обновления обновляет все строки, когда это необходимо?

UPDATE scores t1 
JOIN scores t2 
ON FIND_IN_SET(t1.id, t2.vals) 
SET t1.total = t1.total + 1 
WHERE t2.updated = 0; 

Таблица перед запуском Query

"id" "total" "vals" "updated" 
"1"  "0"  ""  "0" 
"2"  "0"  ""  "0" 
"3"  "0"  ""  "0" 
"4"  "0"  "1,2,3" "0" 
"5"  "0"  "1,2" "0" 

Желаемые результаты

"id" "total" "vals" "updated" 
"1"  "2"  ""  "0" 
"2"  "2"  ""  "0" 
"3"  "1"  ""  "0" 
"4"  "0"  "1,2,3" "0" 
"5"  "0"  "1,2" "0" 

Что я получаю

"id" "total" "vals" "updated" 
"1"  "1"  ""  "0" 
"2"  "1"  ""  "0" 
"3"  "1"  ""  "0" 
"4"  "0"  "1,2,3" "0" 
"5"  "0"  "1,2" "0" 

С update scores set totals = 1 where updated = 0 обновляет все строки, это тоже должно сработать.

+1

Он обновляет только те строки, которые соответствуют 'ON' условию. – Barmar

+0

@Barmar Я обновил свой вопрос с результатами. Он обновляется только один раз в моем случае, беря строку '4' – jmenezes

ответ

3

UPDATE только обновляет каждую строку, соответствующую критериям, она не выполняет предложение SET каждый раз, когда оно соответствует другой строке в таблице соединений. Вы можете использовать этот запрос для подсчета количества совпадений и увеличения на это число.

UPDATE scores t1 
JOIN (
    SELECT t1.id id, COUNT(*) matches 
    FROM scores t1 
    JOIN scores t2 
    ON FIND_IN_SET(t1.id, t2.vals) 
    WHERE t2.updated = 0 
    GROUP BY id) t2 
ON t1.id = t2.id 
SET total = total + matches, 
    updated = 1 

FIDDLE

+0

Хорошо работает. Одно небольшое дополнение: если мне нужно установить updated = 1, где строка принадлежит строкам, содержащим vals (в этом случае 4 и 5, поэтому они не будут снова выбраны, когда этот запрос запустится снова), можно ли это сделать в том же самом заявлении, или это нужно будет сделать отдельно. – jmenezes

+0

Вы можете установить столько столбцов, сколько хотите. Я обновил ответ. – Barmar

+0

На самом деле я имел в виду, что для этого нужно только 4 и 5 в 1. Строки, которые были выбраны для обновления. Я буду использовать это решение в разной степени. Спасибо за помощь. – jmenezes

Смежные вопросы