【问题标题】:MySql update value with multitalbe selectMySql 使用 multitalbe 选择更新值
【发布时间】:2015-04-02 17:21:55
【问题描述】:

我需要每周左右编写 MySql 脚本来自动更改 Redmine bugtracker 中的成员角色。问题是我获得了用户登录名,并且要获得成员角色 ID 有很长的路要走(您可以通过 find_in_set 函数中的 hte 嵌套选择来弄清楚)。 我做了这个查询,它实际上显示了我想要的,但是表格没有更新:

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

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

【问题讨论】:

  • 我很想知道为什么你必须每周更换角色
  • 很简单。我有一个角色比其他角色更特权,并且该角色每周分配给不同的用户,所以我别无选择,只能制作一个脚本来更改角色,而不是手动更改它。 :)

标签: mysql redmine


【解决方案1】:

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

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

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

【讨论】:

  • 都试过了:UPDATE member_roles SET role_id ='4' IN (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 role_id ='4' WHERE role_id=(select statement) 两种方法都给了我相同的结果:#1093 - You can't specify target table 'member_roles' for update in FROM clause
  • 只需从 SELECT 查询的 FROM 子句中删除表“member_roles”
【解决方案2】:

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

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

【讨论】:

  • 它会抛出一个错误:'#1064 - 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 'UDPATE member_roles SET role_id = '4' WHERE role_id = '6' AND FIND_IN_SET( m' at line 1 ' 附近使用正确的语法
  • 我打错了 - UPDATE,而不是 UDPATE。
  • 纠正错字后,我们有:#1093 - You can't specify target table 'member_roles' for update in FROM clause
  • 好的,我已经重写了查询以使用多表语法,摆脱了您的子查询。首先测试 SELECT 语句 - 如果它看起来正确,然后尝试 UPDATE 查询。
  • 看起来使用连接比嵌套选择查询更好。您的多表语法完成了这项工作。 role_id = '6' 的条件是防止更改错误角色的权限,所以我也会使用它。
【解决方案3】:

试试这个:

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

【讨论】:

  • 不幸的是它给出了错误:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的“FROM member_roles WHERE members.id = member_roles.member_id AND members.use”附近使用正确的语法
  • UPDATE member_roles set role_id='4' WHERE role_id IN( 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')
猜你喜欢
  • 2019-01-11
  • 2011-09-21
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 2018-10-21
  • 1970-01-01
相关资源
最近更新 更多