MySQL - 删除不在 find_in_set 中的地方

MySQL - delete where not in find_in_set

我正在寻找正确的语法来删除不在逗号分隔行中的记录。

table一个

| id | product_id | attribute_id |
|----|------------|--------------|
| 1  | 123        | 45           |
| 2  | 123        | 46           |
| 3  | 124        | 34           |
| 4  | 124        | 33           |

table B

| code | Axis  |
|------|-------|
| 123  | 45,46 |
| 124  | 34    |

我的目标是从 table A 中删除属性 ID 不在 table B 轴值中的所有行(在此示例中,id = 4 的行)。

我尝试做一个 SELECT 之前:

SELECT A.attribute_id, A.product_id
FROM tableA as A
LEFT JOIN (SELECT * FROM tableB) AS B
ON FIND_IN_SET(A.attribute_id, B.`axis`)

但是没有运气。

我该怎么做?

您可以尝试以下方法 SELECT 数据:

SELECT A.attribute_id, A.product_id 
FROM tableA AS A LEFT JOIN tableB AS B ON A.product_id = B.code
WHERE IFNULL(FIND_IN_SET(A.attribute_id, B.Axis), 0) = 0

您可以使用以下命令 DELETE table A 上的行(基于 SELECT):

DELETE FROM tableA WHERE id IN (
    SELECT A.id 
    FROM tableA AS A LEFT JOIN tableB AS B ON A.product_id = B.code
    WHERE IFNULL(FIND_IN_SET(A.attribute_id, B.Axis), 0) = 0
)

demo: http://sqlfiddle.com/#!9/3a3e13/6/0

这个怎么样:

DELETE FROM tableA WHERE id IN
(
 SELECT A.id
 FROM tableA AS A
 LEFT JOIN tableB AS B
 ON A.product_id = B.code AND FIND_IN_SET(CONCAT(A.attribute_id), B.Axis) = 0;
)

如果您的 attribute_id 字段是 char 或 varchar,请忽略 CONCAT 函数。