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
我需要编写 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