MySQL实现指定商品颜色选项同步至同分类其他商品
解决MySQL批量同步商品颜色选项的问题
我明白你的需求了——要把某款商品的所有颜色选项完全复制到它所属分类下的其他商品,并且替换掉这些商品原来的颜色选项记录。你之前的插入语句失败,是因为子查询返回了多个productId值,没法直接和源商品的颜色选项行一一对应匹配插入。
下面是可以正常运行的完整解决方案:
步骤1:删除目标商品的原有颜色选项记录
首先清理掉同分类下除源商品外的所有商品的旧颜色选项:
DELETE co FROM ColorOptions co JOIN Product2Category p2c ON co.productId = p2c.productId WHERE p2c.categoryId = ( SELECT categoryId FROM Product2Category WHERE productId = 1 LIMIT 1 ) AND co.productId != 1;
这里用JOIN替代了IN子查询,逻辑更清晰,而且能避免一些潜在的子查询问题。子查询是为了自动获取源商品(productId=1)所属的分类,如果你已经知道分类ID,直接写p2c.categoryId = 1会更高效。
步骤2:批量插入同步后的颜色选项记录
接下来用JOIN的方式生成需要插入的数据集,把源商品的颜色选项和目标商品关联起来:
INSERT INTO ColorOptions (productId, colorId, cost, sorter) SELECT p2c.productId, co.colorId, co.cost, co.sorter FROM ColorOptions co CROSS JOIN Product2Category p2c WHERE co.productId = 1 AND p2c.categoryId = ( SELECT categoryId FROM Product2Category WHERE productId = 1 LIMIT 1 ) AND p2c.productId != 1;
这里的CROSS JOIN会把源商品的每一条颜色选项记录,和同分类下的每个目标商品进行组合,这样就能批量生成所有需要插入的行。同样,如果你明确知道分类ID,直接替换子查询部分即可。
验证结果
执行完上面的语句后,你的ColorOptions表就会变成你期望的样子:
+-----------+---------+------+--------+ | productId | colorId | cost | sorter | +-----------+---------+------+--------+ | 1 | 1 | 10 | 1 | | 1 | 3 | 0 | 2 | | 1 | 33 | .04 | 5 | | 2 | 1 | 10 | 1 | | 2 | 3 | 0 | 2 | | 2 | 33 | .04 | 5 | | 3 | 1 | 10 | 1 | | 3 | 3 | 0 | 2 | | 3 | 33 | .04 | 5 | +-----------+---------+------+--------+
如果需要适配其他源商品,只需要把语句中的productId = 1替换成对应的商品ID就可以了。
内容的提问来源于stack exchange,提问作者EricImprint
相关产品推荐
相关产品推荐

