2016-05-10 5 views
0

Я работаю с PHP, и я сделал этот код: `Объединить несколько запросов SQL результаты

 $categories = array('casual','dinner', 'kids'); 
      $numberOfCategories = count($categories); 

       for ($i=0; $i < $numberOfCategories; $i++) { 

        $req = $pdo->query(' 
        SELECT ProductID 
         , ProductCategoryID 
         FROM products 
        WHERE ProductCategoryID LIKE "%'.$categories[$i].'%" 
        '); 

        while (${"relatedProduct" . $i} = $req->fetch()) { 
         var_dump(${"relatedProduct" . $i}); 
        } 
       } 

`

После запуска кода я получил следующий результат: Query Results

Если вы посмотрите на это внимательно, вы заметите, что некоторые продукты повторяют их самостоятельно (что нормально).

То, что я хочу сделать сейчас его объединить результат каждого цикла, хранящегося в переменной ${"relatedProduct" . $i} и фильтровать этот результат (результат после объединения результатов каждого цикла), чтобы избежать повторения продуктов, основанных на колонке ProductID

Пожалуйста, помогите мне решить эту проблему.

+0

Как/почему ProductCategoryID список разделенных запятой ??? – Strawberry

+1

Есть ли вероятность, что вы можете реорганизовать свою БД? Просто создайте 'ProductCategory (ProductID, категория)' таблицу и пусть СУБД сделать работу с надлежащим запросом, – Serg

+1

А как «% что-то%» запроса в цикле? это убийца базы данных. Как мне предложили другие, вам нужно переосмыслить дизайн своей базы данных. – e4c5

ответ

2

Избегайте включение строк непосредственно в SQL (потенциальную опасность атак внедрения SQL). Вместо этого используйте параметризованные подготовленные инструкции.

DISTINCT даст вам уникальные строки (Prod.ID/Cat.ID комбинации). Вы можете комбинировать поисковые иглы с | и сравнить их как регулярные выражения от RLIKE. Результат - сумма того, что вы получаете с LIKE %needle% на каждый.

$req = $pdo->prepare(' 
    SELECT DISTINCT 
    `ProductID`, 
    `ProductCategoryID` 
    FROM 
    `products` 
    WHERE 
    `ProductCategoryID` RLIKE :pattern 
    '); 

$categories = array('casual','dinner', 'kids'); 
$cats = implode("|", $categories); 

$req->bindParam(':pattern', $cats, PDO::PARAM_STR); 
$req->execute(); 
0
$pdo->query(' SELECT GROUP_CONCAT(ProductCategoryID) as ProductCategoryID 
         FROM products 
        WHERE ProductCategoryID LIKE "%'.$categories[$i].'%" 
        '); 

с помощью этого U'll получить одну строку со всеми productCategoryIDs с соответствующими условиями.

Теперь вы можете использовать array_unique() функцию, чтобы получить уникальный ProductCategoryID

Смежные вопросы