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
这不起作用。有没有其他方法可以做到这一点?
【问题讨论】:
您用什么编程语言编写查询? 我正在使用 php 和 mysql。 它现在只是文本,这是另一部分我想我不确定它是否需要是 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 - 如何选择值在数组中的行?的主要内容,如果未能解决你的问题,请参考以下文章