2016-09-05 3 views
3

У меня есть массив идентификаторов, которые я хочу использовать внутри оператора IN (sql). Однако это можно сделать только тогда, когда оно написано правильно, например: IN ('12', '13', '14')Отдельные идентификаторы запятыми и котировки

Как я могу изменить массив идентификаторов в этот формат? Это означает добавление кавычек вокруг каждого числа и после каждого числа, окруженного кавычками, запятой, кроме последней в массиве.

Мой код:

$parent    = "SELECT * FROM `web_categories` WHERE `parent_id` = 13 AND published = 1"; 
$parentcon  = $conn->query($parent); 
$parentcr   = array(); 
while ($parentcr[] = $parentcon->fetch_array()); 

foreach($parentcr as $parentid){ 
    if($parentid['id'] != ''){ 
     $parentoverzicht .= "".$parentid['id'].""; 
    } 
} 

позже я хочу, чтобы использовать его как это:

$project = "SELECT * FROM `web_content` WHERE `catid` IN ('".$parentoverzicht."') AND state = 1"; 
+0

колонки? Нет необходимости в котировках при числовых литералах. – jarlh

ответ

1

ли это как один запрос! У двигателей SQL есть всевозможные оптимизации для работы с таблицами, и выполнение циклов в вашем коде обычно дороже.

Очевидный запрос для ваших целей будет:

SELECT wc.* 
FROM web_content wc 
WHERE wc.catid IN (SELECT cat.id 
        FROM web_categories cat 
        WHERE cat.parent_id = 13 AND cat.published = 1 
       ) AND 
     wc.state = 1; 
+0

Спасибо! Я соглашусь с этим, потому что это самый быстрый и чистый ответ. – twan

1

Использование взрываться() ..

<?php 
    $a1 = array("1","2","3"); 
    $a2 = array("a"); 
    $a3 = array(); 

    echo "a1 is: '".implode("','",$a1)."'<br>"; 
    echo "a2 is: '".implode("','",$a2)."'<br>"; 
    echo "a3 is: '".implode("','",$a3)."'<br>"; 
?> 
output->>>>>>> 
a1 is: '1','2','3' 
a2 is: 'a' 
a3 is: '' 
1

В качестве альтернативы вы можете использовать единый запрос присоединиться, как это.

SELECT con.* FROM `web_content` as con LEFT JOIN `web_categories` as cat 
ON con.catid=cat.id WHERE cat.parent_id=13 AND published = 1 
1

Если тип столбца в БД является целым числом вы на самом деле не нужно процитировать значения, но в случае, если это не так, вы можете использовать array_map процитировать каждый элемент в массиве, а затем implode присоединиться их запятыми:

<?php 

$ids = [1, 2, 3, 4, 5]; 

$sql = 'SELECT * FROM mytable WHERE id IN (?)'; 

$in_clause = array_map(function ($key) { 
    return "'$key'"; 
}, $ids); 

$sql = str_replace('?', implode(',', $in_clause), $sql); 

echo $sql; 

Результат:

SELECT * from mytable where id in ('1','2','3','4','5')

1

Вы можете сделать что-то вроде этого:

$ids = ['1','2','3','4']; //array of id's 
$newArr = array(); //empty array.. 
foreach($ids as $ids) 
{ 
    $newArr[] = "'".$ids."'"; //push id into new array after adding single qoutes 
} 
$project = "SELECT * FROM `web_content` WHERE `catid` IN (".implode(',',$newArr).") AND state = 1"; /// implode new array with commaa. 
echo $project; 

Это даст вам: тип данных

SELECT * FROM `web_content` WHERE `catid` IN ('1','2','3','4') AND state = 1 
Смежные вопросы