MySQL - 如何选择值在数组中的行?

Posted

技术标签:

【中文标题】MySQL - 如何选择值在数组中的行?【英文标题】:MySQL - How to select rows where value is in array? 【发布时间】: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

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

【问题讨论】:

您用什么编程语言编写查询? 我正在使用 phpmysql 它现在只是文本,这是另一部分我想我不确定它是否需要是 varchar、文本或你有什么。 您是否尝试定义一个子查询来返回 ids 而不是您调用的 ids 数组! 等等,我可能误会了。 ids 是否是您数据库中的另一个字段?或者它是一个 PHP 变量?如果是 PHP 变量,是数组还是字符串? 【参考方案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) 产生两条记录。

【讨论】:

以上是关于MySQL - 如何选择值在数组中的行?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 如何选择表中的行,其中 id 值位于另一个表中的逗号分隔字段中?

如何选择字符串的一个字符作为单独的行 MySQL

如何将mysql数据的行/列存储在数组中

Mysql:从一个表中选择不在另一个表中的行

如何实现子查询以选择与三个主题中的两个主题匹配的行?

如何在 MySQL 中选择最新的行?