|
Вопрос о порядке обновления столбцов в запросе
|
|||
---|---|---|---|
#18+
Здравствуйте, уважаемые коллеги! Мне нужно вести учет количества авторизаций пользователя в течении текущего дня. Т.е. - если это его первый вход на сегодня - поставить 1, а если N-й - сохранить номер его порядкового захода за этот день. Спроектировал такой запрос: Код: sql 1.
Но он не всегда работает как ожидается, иногда счетчик просто ползет вверх и не сбрасывается по условию несколько дней. Мне кажется, что проблема в непредсказуемости выполнения обновлений столбцов - сначала обновляется last_login, а затем вычисляется его разница с CURDATE(). Можно MySQL как-то "заставить" выполнить обновление по порядку? Или лучше такое обновление на два отдельных запроса? Спасибо за вашу помощь! ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 10:08 |
|
Вопрос о порядке обновления столбцов в запросе
|
|||
---|---|---|---|
#18+
Зачем на два запроса-то? Просто используй NOW() вместо last_login где нужно уже новое значение. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 13:37 |
|
Вопрос о порядке обновления столбцов в запросе
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Зачем на два запроса-то? Просто используй NOW() вместо last_login где нужно уже новое значение. Так в смысле? Мне нужно "сбросить к 1" today_count=1, но только если last_login датируется вчерашним днем. А сам last_login нужно обновлять при каждом логине - это время последней авторизации. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 16:02 |
|
Вопрос о порядке обновления столбцов в запросе
|
|||
---|---|---|---|
#18+
e_moon, Насколько помню, порядок вычисления значений в UPDATE SET - слева-направо. Соответственно Ваш запрос верен. Или косяк где-то ещё или одно из двух. В любом случае https://www.opennet.ru/base/dev/pl_sql_update.txt.html первое попавшееся, утверждает про это так же. Даже приведен "крайний запрос": UPDATE persondata SET age=age*2, age=age+1;, но можно же проверить.. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 17:28 |
|
Вопрос о порядке обновления столбцов в запросе
|
|||
---|---|---|---|
#18+
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%. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 19:04 |
|
Вопрос о порядке обновления столбцов в запросе
|
|||
---|---|---|---|
#18+
e_moon, ver MySQL DDL таблицы и триггеры на эту таблицу ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 19:42 |
|
Вопрос о порядке обновления столбцов в запросе
|
|||
---|---|---|---|
#18+
и NOW() работает с тайм зоной ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 20:03 |
|
Вопрос о порядке обновления столбцов в запросе
|
|||
---|---|---|---|
#18+
DATE_FORMAT - явно лишний. Если дата меньше, то она и с компонентой времени будет меньше. Так что Код: sql 1. 2. 3. 4. 5. 6. 7.
Теперь можно избавиться от CASE, памятуя взаимоотношение MySQL с булевыми значениями Код: sql 1. 2. 3. 4.
Так что полностью согласен с Alex_Ustinov ver MySQL DDL таблицы и триггеры на эту таблицу ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 20:30 |
|
Вопрос о порядке обновления столбцов в запросе
|
|||
---|---|---|---|
#18+
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=f93ed2cd1bfc8f14b17208b6297ea240 *влоб вроде все работает раздумывать уже не хочется и пишем NOW() datetime а сравниваем с DATE. что то здесь не так, равно (=) не бывает для СЕГОДНЯ, ELSE типа не работает ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2020, 20:34 |
|
Вопрос о порядке обновления столбцов в запросе
|
|||
---|---|---|---|
#18+
Akina, Красиво вышло! Обычно я как-то боюсь без явной конвертации типов (Bool. -> Int. в этом случае) такое использовать. Но буду пробовать ваш запрос, отпишусь. И да, как-то забыл что у меня на last_login стоит ON UPDATE CURRENT_TIMESTAMP в самой таблице. Попробую его убрать, может в этом дело... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 09:38 |
|
Вопрос о порядке обновления столбцов в запросе
|
|||
---|---|---|---|
#18+
Akina DATE_FORMAT - явно лишний. Если дата меньше, то она и с компонентой времени будет меньше. Так что Код: sql 1.
Не работает, вычисляет как 1, независимо от true или false в подвыражении. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 14:21 |
|
Вопрос о порядке обновления столбцов в запросе
|
|||
---|---|---|---|
#18+
e_moon, никогда не надо "заморачиваться" над красотой в начале пути, сначала надо выяснить "влоб", почему не работает как надо. Смотрите (какой клиент?) что передается в базу данных. Проверяйте с командной строки прямым запросом к БД. Выше ссылка на удобный интерфейс к базам данных, там можно все менять и ссылку на изменения кидать сюда. вот ссылка повтор https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=f93ed2cd1bfc8f14b17208b6297ea240 меняйте там же и ссылку сюда. Может проблема в вашем интерфейсе... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 19:34 |
|
Вопрос о порядке обновления столбцов в запросе
|
|||
---|---|---|---|
#18+
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.
fiddle ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2020, 20:48 |
|
|
start [/forum/topic.php?fid=47&gotonew=1&tid=1828348]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
132ms |
get topic data: |
14ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 265ms |
total: | 517ms |
0 / 0 |