MySql 使用 multitalbe 更新值 select

MySql update value with multitalbe select

我需要编写 MySql 脚本以每周左右自动更改 Redmine bugtracker 中的成员角色。问题是我获得了用户登录并且有很长的路要到达成员角色 ID(你可以通过 hte nested select in find_in_set 函数找出什么)。 我做了这个查询,它实际上显示了我想要的,但是 table 没有更新:

    SELECT REPLACE (role_id, '6', '4') as role_id 
    FROM member_roles 
    WHERE FIND_IN_SET( member_roles.member_id , (
        SELECT member_roles.member_id 
        FROM members,users,member_roles, roles 
        WHERE members.id=member_roles.member_id 
        AND members.user_id=users.id 
        AND member_roles.role_id=roles.id 
        AND users.login='user01'))

本次查询的结果是:

    -----------
    | role_id |
    -----------
    |    4    |
    -----------

我不知道如何更新 table 而不是只显示此查询的结果。 任何帮助将不胜感激。

我把整个东西转换成 multi-table syntax for UPDATE:

UPDATE member_roles 
JOIN members ON members.id = member_roles.member_id
JOIN users ON members.user_id = users.id
JOIN roles ON member_roles.role_id=roles.id 
SET member_roles.role_id = '4'
WHERE member_roles.role_id = '6'
AND users.login='user01'

请注意,我添加了条件 role_id = '6' 以允许您的 REPLACE() 声明 - 我不确定您是否需要。

希望我的所有条件都正确 - 您可能想先这样测试一下:

SELECT role_id
FROM member_roles 
JOIN members ON members.id = member_roles.member_id
JOIN users ON members.user_id = users.id
JOIN roles ON member_roles.role_id=roles.id 
WHERE member_roles.role_id = '6'
AND users.login='user01'

检查并确保您获得的记录数量与之前相同。

试试这个:

UPDATE member_roles
set role_id='4'
WHERE FIND_IN_SET( member_roles.member_id , (
        SELECT member_roles.member_id 
        FROM members,users,member_roles, roles 
        WHERE members.id=member_roles.member_id 
        AND members.user_id=users.id 
        AND member_roles.role_id=roles.id 
        AND users.login='user01'))

您只需将该查询放在更新子句中,例如:

UPDATE  member_roles SET YOUR_FIELD(S)_TO_UPDATE=VALUE(S) 
   WHERE role_id=(YOUR_SELECT_CLAUSE)

如果您有多个结果,您可以在 where 子句中将运算符更改为 IN