2016-05-10 108 views
0

我與PHP的工作和我有此代碼: Query Results將多個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}); 
        } 
       } 

`

運行,我得到了以下結果代碼後如果仔細觀察它,您會注意到某些產品會自我重複(這是正常的)。

我現在想做自己存儲在變量${"relatedProduct" . $i}每次循環的結果結合起來,篩選結果(結合每個循環的結果後結果),以避免基於列ProductID

的產品重複什麼

請幫我解決這個問題。

+0

如何/爲什麼ProductCategoryID一個逗號分隔的列表??? – Strawberry

+1

你有可能重構你的數據庫嗎?只需創建'ProductCategory(ProductId,Category)'表,並讓DBMS用適當的查詢來完成這項工作, – Serg

+1

A就像循環中的'%something%'查詢一樣?這是一個數據庫殺手。正如其他人在我之前所建議的,您需要重新考慮您的數據庫設計。 – e4c5

回答

2

避免將字符串直接包含到SQL中(潛在的SQL注入攻擊危險)。改用參數化準備語句。

DISTINCT會爲您提供唯一的行(產品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].'%" 
        '); 

使用這種日子會把你得到一個單行匹配條件的所有productCategoryIDs。

現在你可以使用array_unique()函數來獲得獨特ProductCategoryID