MySQL在多联接语句中更新,仅第三表中的最大值

问题描述

(我知道可以通过重新设计数据库解决此问题,但是我已经花了很多时间研究我的问题,希望能够对以后的学习有所帮助。)

我有一个注册系统。参加某项活动的用户将被放置在注册表中,该表将链接到活动表,该表将链接到周表,我需要匿名化(更新)用户表中的名称用户最后一次参加活动的时间超过四周时。

我的桌子是这样的:

USERS
id,name

REGISTRATION
uid,aid (uid = USERS.id,aid = ACTIVITY.id)

ACTIVITY
wid (wid = WEEKS.id)

WEEKS
year,weeknumber

我的任务是找到所有未注册活动4周的USERS.id,我将在这种情况下匿名(更新)USERS.name字段。因此,我需要选择所有用户,并通过注册表找到具有最新WEEKS.year + WEEKS.weeknumber的活动,然后确定该条目是否已超过4周。

我相信我已经能够通过以下语句作为 SELECT 解决此问题:

SELECT u.id,r.act_id,a.wid,w.weeknumber,w.year
FROM users AS u 
    INNER JOIN registration AS r ON r.uid = u.id
    INNER JOIN activity AS a ON a.id = r.aid
    INNER JOIN weeks AS w ON w.id = (
        SELECT id
        FROM weeks AS w2
        WHERE w2.id = a.wid
        ORDER BY year DESC,weeknumber DESC
        LIMIT 1
        )
WHERE w.year=YEAR(Now())
AND w.weeknumber=WEEK(Now())-5
GROUP BY u.id
ORDER BY u.id DESC

但是我在将其转换为功能性的 UPDATE 语句时遇到了问题。到目前为止,我似乎没有从周表中获取最新的信息:

UPDATE users u
    JOIN registration AS r ON r.uid = u.id
    JOIN activity AS a ON a.id = r.aid
    JOIN weeks AS w ON w.id = (
        SELECT id
        FROM weeks AS w2
        WHERE w2.id = a.wid
        ORDER BY year DESC,weeknumber DESC
        LIMIT 1
        )
SET u.name = 'Anonymized'
WHERE w.year=YEAR(Now())
AND w.weeknumber=WEEK(Now())-5

我将非常感激任何指向正确方向的指针,因为此时我的头在旋转。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)