需要根据另一个表的结果更新表

时间:2019-06-26 06:43:39

标签: mysql sql

我需要根据ads表的结果来更新users表,

如果广告中至少一列已过期(这意味着自上次广告编辑以来的天数已在今天之前结束),则更新“ 用户<”的“ 已更改”列/ strong>”表,将拥有该广告的用户设为1。

这是我的代码,给出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 个答案:

答案 0 :(得分:1)

您需要在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)
;

答案 1 :(得分:1)

解决此问题的正确方法是使用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时,可以有多个匹配项。这可能会影响性能并导致结果不一致。

答案 2 :(得分:0)

这有效:

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