2011-05-20 72 views
4

有沒有一個(棘手/非標準)的方式來做到這一點?在使用'IN(.....)'子句的查詢中使用準備好的語句?

會像

$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%); 

回答

-2

避免使用IN子句中來填充,將進入IN(...)作爲一個逗號分隔的列表中的值的臨時表的方式;那麼無論是在臨時表的列內JOIN或做嵌套選擇:

 inner join temptable T2 on T1.mycol = T2.col1 

OR

 ... where mycol in (Select col1 from temptable) 
+0

這是一個好主意!但是因爲我試圖按照'準備好的方式'來做事情,那麼我要麼運行一個準備好的多插入語句來構建臨時表(運行相同類型的問題),要麼運行一個準備好的單插入語句多次。我知道,多次運行準備好的單插入應該比運行常規單插多次更快,但是它會比多插入還要慢嗎? – EvilAmarant7x 2011-05-20 15:26:56

+0

取決於行數,但多次運行預準備語句是更好的做法。您可以將簡單的分隔字符串傳遞給服務器上的存儲過程,該存儲過程從字符串中提取組成值並將插入操作插入臨時表中。 – Tim 2011-05-26 21:07:02

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(); 
+0

請記住,FIND_IN_SET與IN子句相比非常慢 – RusAlex 2015-10-27 12:05:35

相關問題