【问题标题】:MySQL: Get IDs (explode) from string and use it in NOT IN clauseMySQL:从字符串中获取 ID(分解)并在 NOT IN 子句中使用它
【发布时间】:2022-11-15 15:43:44
【问题描述】:

在一张表中,我有这样的数据列

是否有可能进行查询以这种格式返回此数据:

_IDS_
71554
99188
69337
70534
73575

作为单独的 ID,然后我可以在查询中使用它

WHERE table.o_id NOT IN (_IDS_)

【问题讨论】:

  • WHERE !FIND_IN_SET(table.o_id, CSV_list)
  • 是否有可能进行查询以这种格式返回此数据是的。

标签: mysql


【解决方案1】:

做这样的事情:

Sélect * from table1 where id not in (sélect cast(strcol as int) from table2);

【讨论】:

  • 这不起作用,因为 CAST 更改数据类型但我需要从字符串中分解 ID
【解决方案2】:
  1. 不要以 CSV 格式存储值列表。对其进行规范化,每行存储一个值。

  2. 您可以使用 FIND_IN_SET() 函数针对 CSV 列表测试值。您需要在任何 CSV 列表中都不存在的测试值,因此使用 NOT EXISTS:

    SELECT *
    FROM data_table
    WHERE NOT EXISTS ( SELECT NULL
                       FROM CSV_table
                       WHERE FIND_IN_SET(data_table.o_id, CSV_table.WebImages__images) 
                       );
    
    1. 您可以将 CSV 解析为单独的值。有很多解决方案。例如:
    SELECT CSV_table.id, jsontable.WebImage_id
    FROM CSV_table
    CROSS JOIN JSON_TABLE( CONCAT('[', TRIM(BOTH ',' FROM CSV_table.WebImages__images), ']')
                           '$[*]' COLUMNS (WebImage_id INT PATH '$')
                           ) jsontable 
    

【讨论】:

    【解决方案3】:

    这应该可以满足您的需求

    SELECT * FROM demotbl2 where id not in (SELECT GROUP_CONCAT(TRIM(',' FROM WebImages__images)) FROM demotbl1);

    GROUP_CONCAT() = 合并行,TRIM 删除第一个和最后一个 ,,这会破坏搜索到的数组

    希望能帮助到你

    这是概念证明的小提琴..:D .. Mysql DB Fiddle

    【讨论】:

    • GROUP_CONCAT 会将所有行组合成一个字符串文字。 NOT IN 将充当<>。什么也找不到。
    • 测试了代码 Akina 。工作得很好
    • 73575 出现在第二行的 CSV 中 - 但它是由您的查询返回的。此外,将 GROUP_CONCAT 中的排序更改为 id DESC - 将返回所有行。您错过了您测试的不是NOT IN ( 1,2,3 )(整数值列表)而是NOT IN ( '1,2,3' )(一个字符串值)。
    猜你喜欢
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多