使用multitalbe select的MySql更新值

时间:2015-04-02 17:21:56

标签: mysql redmine

我需要编写MySql脚本,以便每周左右自动更改Redmine bugtracker中的成员角色。问题是我获得了用户登录,并且有很长的方法可以获得成员角色ID(你可以通过在find_in_set函数中使用嵌套选择来解决)。 我做了这个查询,它实际显示了我想要的内容,但表格没有更新:

    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    |
    -----------

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我将整个事情转换为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'

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

答案 2 :(得分:0)

试试这个:

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'))