powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вопрос о порядке обновления столбцов в запросе
13 сообщений из 13, страница 1 из 1
Вопрос о порядке обновления столбцов в запросе
    #40009720
e_moon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, уважаемые коллеги!

Мне нужно вести учет количества авторизаций пользователя в течении текущего дня. Т.е. - если это его первый вход на сегодня - поставить 1, а если N-й - сохранить номер его порядкового захода за этот день.

Спроектировал такой запрос:
Код: sql
1.
UPDATE user_login SET today_count=CASE WHEN DATE_FORMAT(last_login,"%Y-%m-%d")<CURDATE() THEN 1 ELSE today_count+1 END, last_login=NOW() WHERE user_id=999



Но он не всегда работает как ожидается, иногда счетчик просто ползет вверх и не сбрасывается по условию несколько дней. Мне кажется, что проблема в непредсказуемости выполнения обновлений столбцов - сначала обновляется last_login, а затем вычисляется его разница с CURDATE().

Можно MySQL как-то "заставить" выполнить обновление по порядку? Или лучше такое обновление на два отдельных запроса?

Спасибо за вашу помощь!
...
Рейтинг: 0 / 0
Вопрос о порядке обновления столбцов в запросе
    #40009827
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем на два запроса-то? Просто используй NOW() вместо last_login где нужно уже новое значение.
...
Рейтинг: 0 / 0
Вопрос о порядке обновления столбцов в запросе
    #40009898
e_moon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Зачем на два запроса-то? Просто используй NOW() вместо last_login где нужно уже новое значение.

Так в смысле? Мне нужно "сбросить к 1" today_count=1, но только если last_login датируется вчерашним днем. А сам last_login нужно обновлять при каждом логине - это время последней авторизации.
...
Рейтинг: 0 / 0
Вопрос о порядке обновления столбцов в запросе
    #40009935
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
e_moon,

Насколько помню, порядок вычисления значений в UPDATE SET - слева-направо. Соответственно Ваш запрос верен. Или косяк где-то ещё или одно из двух.

В любом случае https://www.opennet.ru/base/dev/pl_sql_update.txt.html первое попавшееся, утверждает про это так же.

Даже приведен "крайний запрос": UPDATE persondata SET age=age*2, age=age+1;, но можно же проверить..
...
Рейтинг: 0 / 0
Вопрос о порядке обновления столбцов в запросе
    #40009980
e_moon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109
e_moon,

Насколько помню, порядок вычисления значений в UPDATE SET - слева-направо. Соответственно Ваш запрос верен. Или косяк где-то ещё или одно из двух.

В любом случае https://www.opennet.ru/base/dev/pl_sql_update.txt.html первое попавшееся, утверждает про это так же.

Даже приведен "крайний запрос": UPDATE persondata SET age=age*2, age=age+1;, но можно же проверить..


Спасибо за эту информацию. В общем - уж и не знаю в чем тут дело. Косяка нет, уже неделю логирую sql-запросы, чтобы отследить - они именно в этом виде 100%.
...
Рейтинг: 0 / 0
Вопрос о порядке обновления столбцов в запросе
    #40009985
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
e_moon,
ver MySQL
DDL таблицы и триггеры на эту таблицу
...
Рейтинг: 0 / 0
Вопрос о порядке обновления столбцов в запросе
    #40009992
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и NOW() работает с тайм зоной
...
Рейтинг: 0 / 0
Вопрос о порядке обновления столбцов в запросе
    #40009998
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DATE_FORMAT - явно лишний. Если дата меньше, то она и с компонентой времени будет меньше. Так что
Код: sql
1.
2.
3.
4.
5.
6.
7.
UPDATE user_login 
SET today_count=CASE WHEN last_login < CURRENT_DATE 
                     THEN 1 
                     ELSE today_count+1 
                     END, 
    last_login=CURRENT_TIMESTAMP
WHERE user_id=999


Теперь можно избавиться от CASE, памятуя взаимоотношение MySQL с булевыми значениями
Код: sql
1.
2.
3.
4.
UPDATE user_login 
SET today_count=(last_login < CURRENT_DATE) * today_count + 1 , 
    last_login=CURRENT_TIMESTAMP 
WHERE user_id=999


Так что полностью согласен с
Alex_Ustinov
ver MySQL
DDL таблицы и триггеры на эту таблицу
...
Рейтинг: 0 / 0
Вопрос о порядке обновления столбцов в запросе
    #40009999
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=f93ed2cd1bfc8f14b17208b6297ea240
*влоб вроде все работает
раздумывать уже не хочется
и пишем NOW() datetime а сравниваем с DATE. что то здесь не так, равно (=) не бывает для СЕГОДНЯ, ELSE типа не работает
...
Рейтинг: 0 / 0
Вопрос о порядке обновления столбцов в запросе
    #40010086
e_moon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Красиво вышло! Обычно я как-то боюсь без явной конвертации типов (Bool. -> Int. в этом случае) такое использовать. Но буду пробовать ваш запрос, отпишусь.
И да, как-то забыл что у меня на last_login стоит ON UPDATE CURRENT_TIMESTAMP в самой таблице. Попробую его убрать, может в этом дело...
...
Рейтинг: 0 / 0
Вопрос о порядке обновления столбцов в запросе
    #40010159
e_moon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
DATE_FORMAT - явно лишний. Если дата меньше, то она и с компонентой времени будет меньше. Так что
Код: sql
1.
today_count=(last_login < CURDATE()) * today_count + 1



Не работает, вычисляет как 1, независимо от true или false в подвыражении.
...
Рейтинг: 0 / 0
Вопрос о порядке обновления столбцов в запросе
    #40010298
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
e_moon,

никогда не надо "заморачиваться" над красотой в начале пути, сначала надо выяснить "влоб", почему не работает как надо.
Смотрите (какой клиент?) что передается в базу данных.
Проверяйте с командной строки прямым запросом к БД.
Выше ссылка на удобный интерфейс к базам данных, там можно все менять и ссылку на изменения кидать сюда.
вот ссылка повтор
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=f93ed2cd1bfc8f14b17208b6297ea240
меняйте там же и ссылку сюда. Может проблема в вашем интерфейсе...
...
Рейтинг: 0 / 0
Вопрос о порядке обновления столбцов в запросе
    #40010330
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
e_moon
Обычно я как-то боюсь без явной конвертации типов (Bool. -> Int. в этом случае) такое использовать.

MySQL 8.0 Reference Manual / ... / Comparison Functions and Operators
Comparison operations result in a value of 1 (TRUE), 0 (FALSE), or NULL.

MySQL 8.0 Reference Manual / ... / Boolean Literals
The constants TRUE and FALSE evaluate to 1 and 0, respectively. The constant names can be written in any lettercase.

Можно не бояться.
e_moon
Не работает, вычисляет как 1, независимо от true или false в подвыражении.

Да, со знаком ошибся.
Код: sql
1.
2.
3.
4.
UPDATE user_login 
SET today_count=(last_login > CURRENT_DATE) * today_count + 1 , 
    last_login=CURRENT_TIMESTAMP 
WHERE user_id=999;


fiddle
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вопрос о порядке обновления столбцов в запросе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]