Необходимо обновить таблицу на основе результатов из другой таблицы - PullRequest
0 голосов
/ 26 июня 2019

Мне нужно обновить таблицу пользователей на основе результатов из таблицы объявлений следующим образом:

, если хотя бы один столбец в объявлениях устарел (то есть продолжительность в днях с момента последнего редактирования объявления закончилась до сегодняшнего дня), а затем обновите столбец « измененный » таблицы « users » для пользователя, владеющего рекламой.

Вот мой код, который выдает ошибку mysql:

UPDATE users SET changed = IF(COUNT (ads.user_id) WHERE    
    (DATEDIFF()/ads.duration)>1 )>0, 1, 0) WHERE ads.user_id = users.id;

Как вы можете видеть, я пытаюсь установить users.changed = 1, если когда-либо из таблицы объявлений этого пользователя истекло хотя бы одно объявление.Обратите внимание, что если длительность равна -1, это не нужно проверять.

Ответы [ 3 ]

1 голос
/ 26 июня 2019

Для правильного подхода к этому используется exists.Условие времени довольно запутанно, но я думаю, что вы хотите:

update users
    set changed = 1
    where exists (select 1
                  from ads a
                  where a.user_id = u.uid and
                        a.last_edited < current_date - ads.duration day
                 );

В частности, это гарантирует, что каждая строка обновляется только один раз.Когда вы используете JOIN в обновлении, вы можете иметь несколько совпадений.Это может повлиять на производительность и привести к противоречивым результатам.

1 голос
/ 26 июня 2019

Вам необходимо присоединиться к таблице ads сразу после оператора UPDATE.

Возможно, вы пытаетесь написать запрос:

UPDATE users
INNER JOIN (
    SELECT DISTINCT user_id FROM ads
    WHERE ( DATEDIFF(NOW(), last_edited) / duration > 1 )
    ) ads ON ads.user_id = users.id
SET changed = IF(COUNT (ads.user_id)
;
0 голосов
/ 26 июня 2019

Это сработало:

UPDATE users 
INNER JOIN ( 
    SELECT DISTINCT ads.user_id AS uid FROM ads 
    WHERE (DATEDIFF(NOW(),ads.last_edited)/ads.duration) > 1
           ) 
    ads 
ON users.id = uid 
SET users.changed=1  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...