【问题标题】:MySQL - How to select rows where value is in array?MySQL - 如何选择值在数组中的行?
【发布时间】:2010-10-27 19:56:01
【问题描述】:

好的,通常我知道如果您知道数组值(在本例中为 1、2、3),您会这样做:

SELECT * WHERE id IN (1,2,3)

但我不知道数组值,我只知道我要查找的值是“存储”在数组中的:

SELECT * WHERE 3 IN (ids) // Where 'ids' is an array of values 1,2,3

这不起作用。有没有其他方法可以做到这一点?

【问题讨论】:

  • 您用什么编程语言编写查询?
  • 我正在使用 PHP 和 MySQL。
  • 它现在只是文本,这是另一部分我想我不确定它是否需要是 varchar、文本或你有什么。
  • 您是否尝试定义一个子查询来返回 ids 而不是您调用的 ids 数组!
  • 等等,我可能误会了。 ids 是否是您数据库中的另一个字段?或者它是一个 PHP 变量?如果是 PHP 变量,是数组还是字符串?

标签: php mysql


【解决方案1】:

使用FIND_IN_SET function

SELECT t.*
  FROM YOUR_TABLE t
 WHERE FIND_IN_SET(3, t.ids) > 0

【讨论】:

  • 您先生,是明星。我到处寻找它,知道它必须在那里。我的直觉告诉我他们应该为此使用 CONTAINS,但我知道什么。
  • @Tomas:只有 MySQL 有这个功能 - 任何其他数据库,你都必须自己构建一些东西。
  • 我不打算切换...但这绝对是个好消息。
  • @OMGPonis 你是我的英雄!
  • @OMGPonies 这正是我想要的。非常感谢。 +1
【解决方案2】:

当查询到达 SQL 时,您必须已经展开列表。执行此操作的简单方法是,如果您使用来自某个内部的、受信任的数据源的 ID,您可以 100% 确定它们是整数(例如,如果您之前从数据库中选择了它们)是这样的:

$sql = 'SELECT * WHERE id IN (' . implode(',', $ids) . ')';

但是,如果您的数据来自用户,您需要确保只获得整数值,也许最容易这样:

$sql = 'SELECT * WHERE id IN (' . implode(',', array_map('intval', $ids)) . ')';

【讨论】:

  • +1 for array_map('intval', ...)。您也可以使用 mysql_real_escape_string() 代替 intval(),这会将整数验证留给 MySQL,但需要额外的逻辑来引用数组元素。
  • 谢谢,但正如我所说,我知道 id 并且不需要根据已知集合搜索行。反之亦然,如下所示。
  • 我相信第二个例子应该是: $sql = 'SELECT * WHERE id IN (' . implode(',', array_map('intval', $ids)) . ')';
  • 是的,应该!我已经解决了。
【解决方案3】:

如果数组元素不是整数,您可以使用如下所示:

$skus  = array('LDRES10','LDRES12','LDRES11');   //sample data

if(!empty($skus)){     
    $sql = "SELECT * FROM `products` WHERE `prodCode` IN ('" . implode("','", $skus) . "') "      
}

【讨论】:

  • 是否可以将查询 LIMIT 值附加到它的偏移量?
【解决方案4】:

如果你使用FIND_IN_SET函数:

FIND_IN_SET(a, columnname) 产生所有包含“a”的记录,单独或与其他人一起

FIND_IN_SET(columnname, a) 只产生单独带有“a”的记录,而不是其他带有“a”的记录

所以如果 record1 是 (a,b,c) 而 record2 是 (a)

FIND_IN_SET(columnname, a) 仅产生记录 2,而 FIND_IN_SET(a, columnname) 产生两条记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 2023-01-21
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    相关资源
    最近更新 更多