Pull to refresh

Comments 16

Хм, спасибо за алерт! Как раз в четверг обновлять хотел — теперь заранее переберу шелы )
А я пока вот жду с обновлением на 5.1.* ветку, ибо помню что где-то пролетали новости, дескать 5.1 рано сделали GA ибо там еще толпа багов не исправлена.
Вы бы чтоли отформатировали как-нибудь запрос то по человечески — глаза же можно сломать, пока станет понятно, что тут к чему. Ну хотя бы как нибудь так:

UPDATE
  xE_tvchannels_dyn AS t0,
  xE_tvchannels_monthrating AS t1
SET
  t0.ratingflushed = 1233522000,
  t1.rating = t1.rating + t0.rating,
  t0.totalrating = t0.totalrating + t0.rating,
  t0.rating = 0
WHERE
  t0.id = t1.cid AND
  t1.month = '200902' AND
  t0.rating > 0 AND
  t0.ratingflushed <1233522000


* This source code was highlighted with Source Code Highlighter.

честно выставил плюсик, тут просто так сказать техническое замечание, не было времени заняться.
Перепишите вообще не используя порядкозависимые выражения.
На этот случай в старой документации написано, что вообще никаких гарантий нет:
For multiple-table updates, there is no guarantee that assignments are carried out in any particular order.
это документация по 4.1 dev.mysql.com/doc/refman/4.1/en/update.html

И вообще странный вы способ избрали и не соответствующий духу SQL.
SQL выражает что вы хотите сделать с данными, а не как именно.
Кстати да, язык SQL декларативный. Это предупреждение есть и в более новых версиях документации, вплоть до шестой — dev.mysql.com/doc/refman/6.0/en/update.html

Так что завтра порядок действий может еще раз измениться, так как предупреждали же :)

очень верное замечание. «язык SQL декларативный»
> Перепишите вообще не используя порядкозависимые выражения.
Как например?
Даже не знаю. Не заметил сначала зависимостей друг от друга.
В два запроса явно будет хуже, но может для вас это допустимо?

С переменными устроит? Конечно, это тоже отход от парадигмы sql, но без нее придется обновлять в два запроса или с подзапросом, что неоптимально.

Проверьте как будет работать если использовать переменную:

UPDATE
xE_tvchannels_dyn AS t0,
xE_tvchannels_monthrating AS t1
SET
@oldrating=t0.rating,
t0.ratingflushed = 1233522000,
t1.rating = t1.rating + @oldrating,
t0.totalrating = t0.totalrating + @oldrating,
t0.rating = 0
не, с переменными тоже ничего хорошего

The general rule is never to assign a value to a user variable in one part of a statement and use the same variable in some other part of the same statement. You might get the results you expect, but this is not guaranteed.
Переменные ничего не изменят совершенно… увы…
> За операцию перевода текущего рейтинга в месячный и в суммарный отвечает простенький запрос, который запускается раз в сутки

Раз в сутки можно и два запроса вместо одного сделать (зато заведомо верных).
Вообще наличие подобной проблемы может указывать на ошибки в логике.
Думал о двух запросах, но пока решил оставить всё как есть =)
Sign up to leave a comment.

Articles