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

Tom*_*mas 35 php mysql

好吧,通常我知道你会做这样的事情你知道数组值:

SELECT * WHERE id IN (1,2,3)
Run Code Online (Sandbox Code Playgroud)

但是...我不知道数组值,我只知道我想在"储存"阵列发现的价值:

SELECT * WHERE 3 IN (ids) // Where 'ids' is an array of values 1,2,3
Run Code Online (Sandbox Code Playgroud)

哪个不起作用.还有另一种方法吗?

OMG*_*ies 72

使用FIND_IN_SET函数:

SELECT t.*
  FROM YOUR_TABLE t
 WHERE FIND_IN_SET(3, t.ids) > 0
Run Code Online (Sandbox Code Playgroud)

  • @Tomas:只有MySQL有这个功能 - 任何其他数据库,你必须自己构建一些东西. (5认同)

Vot*_*ple 18

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

$sql = 'SELECT * WHERE id IN (' . implode(',', $ids) . ')';
Run Code Online (Sandbox Code Playgroud)

但是,如果您的数据来自用户,则需要确保只获取整数值,可能最容易如此:

$sql = 'SELECT * WHERE id IN (' . implode(',', array_map('intval', $ids)) . ')';
Run Code Online (Sandbox Code Playgroud)


小智 9

如果数组元素不是整数,则可以使用以下内容:

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

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


小智 5

如果使用该FIND_IN_SET功能:

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

FIND_IN_SET(columnname, a) 仅产生仅在其中包含“ a”的记录,而不产生与其他记录

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

FIND_IN_SET(columnname, a)仅产生record2而FIND_IN_SET(a, columnname)产生两个记录。