You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:12:07