【问题标题】:MySQL - delete where not in find_in_setMySQL - 删除不在 find_in_set 中的位置
【发布时间】:2018-02-01 10:48:02
【问题描述】:

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

表 A

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

表 B

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

我的目标是从表 A 中删除属性 id 不在表 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`)

但没有任何运气。

我该怎么做?

【问题讨论】:

    标签: mysql find-in-set


    【解决方案1】:

    您可以尝试以下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 表 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
    )
    

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

    【讨论】:

    • 完美!像魅力一样工作。非常感谢您的快速和非常有用的帮助。
    【解决方案2】:

    这个怎么样:

    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 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 2018-08-03
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 2017-11-24
      • 1970-01-01
      • 2014-08-15
      相关资源
      最近更新 更多