如何用MySQL更新每行parent_id为对应父目录的cat_id?
解决JDownloads分类表parent_id赋值的MySQL问题
我来帮你搞定这个更新parent_id的问题!根据你的需求,我们需要给每行的parent_id赋值为其cat_dir_parent对应目录的cat_id,如果找不到匹配的父目录就设为0。你之前用内连接的方式有个关键问题:内连接只会更新能找到匹配父目录的行,那些没有匹配的行根本不会被修改,所以得换成左连接配合COALESCE函数来处理空值场景。
正确的MySQL UPDATE语句
UPDATE joomla_jdownloads_cats_backup t1 LEFT JOIN joomla_jdownloads_cats_backup t2 ON t1.cat_dir_parent = t2.cat_dir_name SET t1.parent_id = COALESCE(t2.cat_id, 0);
语句详细说明
- 自连接逻辑:把表自身关联起来,
t1是需要更新的主表,t2专门用来查找每个目录对应的父目录cat_id,关联条件是t1.cat_dir_parent等于t2.cat_dir_name(也就是父目录的名称)。 - 处理无匹配场景:
COALESCE(t2.cat_id, 0)的作用是,如果t2.cat_id为NULL(意味着找不到对应的父目录),就返回0;否则返回找到的cat_id,完美贴合你的规则。 - 覆盖所有行:左连接(
LEFT JOIN)会保留t1的所有行,不管有没有匹配的t2行,这样所有行的parent_id都会被更新,不会遗漏任何一条数据。
验证你的示例数据
假设你的正确示例数据为(修正了可能的排版误差):
| cat_dir_parent | cat_dir_name | cat_id | parent_id |
|---|---|---|---|
| MyRootDir | dir1 | 1 | ? |
| MyRootDir | dir2 | 2 | ? |
| MyRootDir | 3 | ? |
执行上面的SQL后,结果会变成:
| cat_dir_parent | cat_dir_name | cat_id | parent_id |
|---|---|---|---|
| MyRootDir | dir1 | 1 | 3 |
| MyRootDir | dir2 | 2 | 3 |
| MyRootDir | 3 | 0 |
完全符合你的期望!
内容的提问来源于stack exchange,提问作者Francesco Galgani
相关产品推荐
相关产品推荐

