如何用同一张表的查询结果来更新字段
table中记录了菜单权限信息,菜单和各页面元素有父子关系,表结构和示例数据如下
id,parent_id, action_code, desc
//todo create insert 语句
现在,某个子菜单的父级id有误需要更新。
方法一:两部走
- 去库里SELECT FROM WHRERE 父菜单的ID
- 写出 UPDATE SET id=父菜单的ID WHERE 子菜单
缺点:
- 要查一次库,麻烦。
- 手工赋值,可能出错。
- 硬编码,不同环境插入的数据ID可能不一样。SQL不能通用,不符合DPY原则
方法二 :一步走
首先想到用子查询
先 select id
再 update set 上面的id where …
但是实际做不到
合适的做法如下
UPDATE `action` child
INNER JOIN `action` parent
ON child.action_code='查询' AND parent.action_code='管理'
SET child.id_parent = parent.id;
可以这样理解
利用联合查询,把存储临时变量X,再赋值Y,化为XY在同一行,把同一行的字段X复制给字段Y。联合后看起来的样子如下:
SELECT FROM `action` child
INNER JOIN `action` parent
ON child.action_code='查询' AND parent.action_code='管理';
参考:
https://dba.stackexchange.com/questions/41261/update-table-based-on-the-same-table
https://stackoverflow.com/questions/1262786/mysql-update-query-based-on-select-query
https://www.jianshu.com/p/60b3f987c477