2016-05-10 21 views
0

結果: Query Resultsコンバイン複数のSQLクエリは、私はPHPで働いていると私はこのコードを作った

:私は以下の結果を得たコードを実行した後 `

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

`

をあなたがそれを注意深く見ると、特定の製品がそれを自ら繰り返すことに気付くでしょう(これは正常です)。私は列ProductID

に基づく製品の繰り返しを避けるために(各ループの結果を組み合わせた後の結果)今彼の変数 ${"relatedProduct" . $i}に格納された各ループの結果を結合し、その結果をフィルタリングするために何をしたいのか

この問題を解決するのを助けてください。

+0

を取得するためにarray_unique()関数を使用することができます? – Strawberry

+1

あなたのDBをリファクタリングする可能性はありますか? 'ProductCategory(ProductId、Category)'テーブルを作成し、DBMSに適切なクエリを実行させてください。 – Serg

+1

ループ内で '%something%'のようなクエリですか?それはデータベースの殺人者だ。他の人たちが私の前にあなたのデータベース設計を再考する必要があると提案してきました。 – e4c5

答えて

2

SQLに直接文字列を含めることは避けてください(SQLインジェクション攻撃の危険性があります)。代わりにパラメータ化されたprepared statementを使用してください。

DISTINCTは、固有の行(Prod.ID/Cat.IDの組み合わせ)を提供します。検索針を|と組み合わせて、正規表現としてRLIKEと比較することができます。結果は、それぞれにLIKE %needle%で得られるものの合計です。このU'llを用い

$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].'%" 
        '); 

整合条件を有する全てproductCategoryIDsと単一の行を取得します。

今、あなたは、カンマ区切りのリストをProductCategoryIDされる方法/なぜユニークProductCategoryID

関連する問題