是否有(棘手/非标准)方法?
会像
$stmt = $db->prepare( 'SELECT title FROM episode WHERE id IN (?, ?, ?, ?);
工作?因此,如果我想搜索可变数量的ID,我可以吗
$ids = array(1,2,3,4,5,6,7);
$idSection = implode(array_pad(array(), count($ids), '?')) //To give ?,?,?,?,?,?,?
$stmt = $db->prepare( 'SELECT title FROM episode WHERE id IN ($idSection);
$stmp->execute($ids);
即使这样可行,但对于使用相同的预准备语句运行多组数据仍然没有用,除非每次搜索的$ids
集都是相同的长度而它不是使用名称占位符。
我假设你做了
$stmt = $db->prepare( 'SELECT title FROM episode WHERE id IN (:ids);
$ids = implode('","' array(1,2,3,4,5,6,7));
$stmt->bindParam( ':ids', $ids);
它失败了,因为编写了准备好的语句,它将搜索单个id值,“1”,“2”,“3”,“4”,“5”,“6”,“7”不会不匹配?
我确信有一个更好的答案,而不仅仅是不使用IN(...)
条款。我是否只需手动清理$ids
术语并将其包含在没有占位符的查询中?
$stmt = $db->prepare( "SELECT title FROM episode WHERE id IN $ids AND genre like :genre");
$stmt->bindParam( ':genre', '%$genre%);
答案 0 :(得分:10)
MySql有一个FIND_IN_SET函数,您可以使用它来实现相同的结果:
$ids = array(1,2,3,4,5,6,7);
$stmt = $db->prepare( 'SELECT title FROM episode WHERE FIND_IN_SET(id,?)' );
$param = implode(',',$ids);
$stmt->bind_param('s',$param);
$stmt->execute();
答案 1 :(得分:-2)
避免使用IN子句的一种方法是使用以逗号分隔列表的形式进入IN(...)的值填充临时表;然后在临时表的列上进行INNER-JOIN或进行嵌套选择:
inner join temptable T2 on T1.mycol = T2.col1
OR
... where mycol in ( Select col1 from temptable)