【问题标题】:MySql select IN clause string comma delimitedMySql select IN 子句字符串逗号分隔
【发布时间】:2013-06-04 03:10:07
【问题描述】:

我需要通过以下方式执行选择查询:

select * from my_table where id NOT IN (comma_delimited_string);

实现这一目标的正确方法是什么?

考虑到我可以控制发送字符串的客户端代码这一事实,是否有更好的方法? (字符串将包含大约 30 个 id,所以我尽量避免发送 30 个参数,每个 id 一个)。

谢谢大家

【问题讨论】:

  • 发送 30 个参数有什么问题?您应该能够编写一些代码来为您构建查询以使其更容易。
  • 客户端代码是构建字符串还是构建查询并发送查询?
  • @GordonLinoff 它正在构建字符串并将其发送到存储过程。

标签: mysql select


【解决方案1】:

您可以使用 MySQL FIND_IN_SET 函数:

SELECT *
FROM my_table
WHERE FIND_IN_SET(id, comma_delimited_string) = 0

附录:请注意,上面的查询不可优化,因此如果您在id 上有索引,MySQL 将不会使用它。您必须决定使用 FIND_IN_SET 的相对简单性是否值得潜在的性能影响(我说潜力是因为我不知道 id 是否已编入索引,或者您的表是否足够大以使其成为担心)。

【讨论】:

  • 我不认为FIND_IN_SET 可以使用索引。
  • 绝对不是,而且很好。我将更新答案以警告 OP 该查询将不可优化。由他们来决定这是否是一个问题。
  • @EdGibbs id 已编入索引。该表包含约 3500 条记录。
  • @UdiI 有 3,500 条记录,老实说,我不会太担心优化问题,尤其是使用 NOT IN 查询时。我预计它会在不到一秒的时间内运行。也就是说,我仍然会对其进行一些测试以确保速度可以接受。
  • comma_delimited_string 是否有限制(长度)?它是由VARCHAR 还是group_concat_max_len 决定的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 2012-05-15
  • 2016-09-04
  • 2011-05-13
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多