我需要根据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,则无需检查。
答案 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