Php Mysql使用父名称更新父类别Id

Php Mysql使用父名称更新父类别Id,php,mysql,Php,Mysql,我有一张这样的桌子 id category_name parent_name parent_id 1 Animals & Pet Supplies NULL 0 2 Live Animals Animals & Pet Supplies 0 3 Pet Supplies

我有一张这样的桌子

id     category_name                parent_name            parent_id
1      Animals & Pet Supplies       NULL                       0
2      Live Animals                 Animals & Pet Supplies     0
3      Pet Supplies                 Animals & Pet Supplies     0
4      Bird Supplies                Pet Supplies               0
5      Bird Cage Accessories        Bird Supplies              0
现在我想用category\u name中的parent\u name的id更新parent\u id 如下

id     category_name                parent_name            parent_id
1      Animals & Pet Supplies       NULL                       0
2      Live Animals                 Animals & Pet Supplies     1
3      Pet Supplies                 Animals & Pet Supplies     1
4      Bird Supplies                Pet Supplies               3
5      Bird Cage Accessories        Bird Supplies              4

默认情况下,父id的值为0,如果parent_name=NULL,则应为0,否则应使用category_name的相应id进行更新

我想应该是这样的:

UPDATE my_table SET parent_id=
   (SELECT id FROM my_table t1 WHERE t1.name=my_table.parent_name)
   WHERE parent_name IS NOT NULL;
CREATE TEMPORARY TABLE my_table_temp AS SELECT * FROM my_table;
UPDATE my_table SET parent_id=
   (SELECT id FROM my_table t1 WHERE t1.name=my_table.parent_name)
   WHERE parent_name IS NOT NULL;
DROP TEMPORARY TABLE my_table_temp;
虽然mysql可能会拒绝同一个表的嵌套SELECT查询,但在这种情况下,您可能需要创建一个新的临时表,如下所示:

UPDATE my_table SET parent_id=
   (SELECT id FROM my_table t1 WHERE t1.name=my_table.parent_name)
   WHERE parent_name IS NOT NULL;
CREATE TEMPORARY TABLE my_table_temp AS SELECT * FROM my_table;
UPDATE my_table SET parent_id=
   (SELECT id FROM my_table t1 WHERE t1.name=my_table.parent_name)
   WHERE parent_name IS NOT NULL;
DROP TEMPORARY TABLE my_table_temp;

您可以使用
updatewithleft join轻松完成此操作

update 
table_name t1 
left join table_name t2 on t1.parent_name = t2.category_name
set t1.parent_id = coalesce(t2.id,0) ;

听起来不错。你为什么不做呢?你对此有什么问题吗?但是如果你这样做了,你也应该考虑在之后删除
parent\u name
,因为之后它将不会是标准化的db结构(parent\u name将是多余的,因为你可以通过parent\u id的名称找到parent的名称)谢谢你,Alexander,我需要更新查询来更新parent id,现在所有的父类id都是0。不要忘记
其中父类名称不为NULL的语句。好的一点-我已经更新了答案我的查询是“更新主类t1左连接主类t2在t1上。父类名称=t2。类别名称集t1。父类id=t2.id”它在“字段列表”中显示错误未知列“t2.id”,使用
set t1.parent\u id=coalesce(t2.id,0)
这样,对于
parent\u id
而言,不匹配的数据保持为
0
,而不是
null