Использовать подготовленный оператор в запросе с предложением IN (.....)? - PullRequest
4 голосов
/ 20 мая 2011

Есть ли (хитрый / нестандартный) способ сделать это?

Будет ли что-то вроде

$stmt = $db->prepare( 'SELECT title FROM episode WHERE id IN (?, ?, ?, ?);

работать?Так что, если бы я хотел найти переменное количество идентификаторов, я мог бы сделать

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

Это не удастся, потому чтоподготовленный оператор был составлен так, что он будет искать единственное значение идентификатора, и «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 ]

10 голосов
/ 18 мая 2012

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 голосов
/ 20 мая 2011

Чтобы избежать использования IN-предложений, нужно заполнить временную таблицу значениями, которые будут помещены в IN (...) в виде списка через запятую; затем либо INNER-JOIN в столбце временной таблицы, либо выполните nested-select:

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

OR

       ...  where mycol in ( Select col1 from temptable)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...