MySQL DELETE WHERE NOT IN结合FIND_IN_SET语法问题求助
解决方法:删除Table A中不在对应Table B Axis列表里的记录
你的思路方向是对的,但问题出在关联条件没有匹配产品ID和code,导致关联逻辑不准确。让我一步步帮你修正:
第一步:先验证要删除的行
先写一个SELECT语句确认哪些行需要被删除,避免误删:
SELECT A.* FROM tableA A LEFT JOIN tableB B ON A.product_id = B.code -- 关键:必须匹配对应的产品/Code AND FIND_IN_SET(A.attribute_id, B.Axis) WHERE B.code IS NULL; -- 找不到匹配的就是要删除的行
这个语句会返回你例子里的id=4那行,因为它的attribute_id=33不在tableB中code=124的Axis列表34里。
第二步:执行删除操作
你可以用两种方式实现删除:
方式1:通过JOIN删除(效率较高)
DELETE A FROM tableA A LEFT JOIN tableB B ON A.product_id = B.code AND FIND_IN_SET(A.attribute_id, B.Axis) WHERE B.code IS NULL;
方式2:通过NOT EXISTS子查询(逻辑更直观)
DELETE FROM tableA WHERE NOT EXISTS ( SELECT 1 FROM tableB B WHERE tableA.product_id = B.code AND FIND_IN_SET(tableA.attribute_id, B.Axis) );
为什么你之前的SELECT没成功?
你之前的语句只通过FIND_IN_SET关联两张表,没有匹配product_id和code,这会导致:
- Table A的行可能和Table B中不对应产品的行做关联,结果混乱
- 比如
id=4的行,会和Table B中code=123的行做FIND_IN_SET(33, '45,46')(结果为0),但因为是LEFT JOIN依然会返回,无法正确筛选出要删除的行
潜在注意事项
如果你的Axis字段里有空格(比如45, 46),FIND_IN_SET会失效,这时候需要先去掉空格:
-- 修改后的关联条件 AND FIND_IN_SET(A.attribute_id, REPLACE(B.Axis, ' ', ''))
内容的提问来源于stack exchange,提问作者Mitchum
相关产品推荐
相关产品推荐

