1

製品のテーブル、カスタム定義のテーブル、および値のテーブルがあります。

製品

id   product_name         price
48   product one          32.99
87   another product      2.50
...etc

フィールド定義

id   name
6    brand
9    colour
23   flavour
...etc

フィールド値

product_id   fielddef_id   value
48           6             Rowntree
48           9             Red
48           23            Strawberry
87           6             Cadburys
87           9             Yellow
87           23            Lemon
etc...

各フィールド定義のドロップダウン選択を備えたフィルターを使用して検索を実行しようとしています:

$sql = "SELECT * FROM products INNER JOIN fieldvals ON fieldvals.product_id=products.id WHERE product_name LIKE '%".$q."%' AND (fielddef_id='7' AND value='".$c."' ) AND (fielddef_id='8' AND value='".$b."') AND (fielddef_id='9' AND value='".$f."') AND (fielddef_id='10' AND value=' ".$t."') AND (fielddef_id='5' AND value='".$h."') AND (fielddef_id='6' AND value='".$v."')";

SQL をエコーすると、次のような結果が得られます。

SELECT * FROM products INNER JOIN fieldvals ON fieldvals.product_id=products.id WHERE product_name LIKE '%cola%' AND (fielddef_id='7' AND value='Purple') AND (fielddef_id='9' AND value='Apple' ) AND (fielddef_id='10' AND value='Party') AND (fielddef_id='5' AND value='true') AND (fielddef_id='6' AND value='true')

このコードは、$q の後の 1 つの基準に対してのみ機能します。つまり、$q と $c、または $q と $h、または $q と $v を含めることができ、一致する製品を正常に検出できますが、ネストされた複数の AND ステートメントは機能しません。動作するようです。

どこが間違っていますか?

4

1 に答える 1

1

このリンクは、誰かが同じ「フィールドデータ」テーブルからクエリを実行し、複数の条件が必要な場合に同様の質問を提供します。

発生している問題は、単一のレコードの場合、特定の列に対して複数の値を持つことができず、複数のレコードを比較し、探している HAVING COUNT(*) = 基準を適用した結果のみであるということです。もう1つ(上記の私のリンクによる)はそれを示しています。この同様のアプローチを問題にどのように適用できますか。

SELECT 
      P.ID,
      P.Product_Name,
      P.Price
   FROM 
      products P
         INNER JOIN fieldvals FV1
            ON P.id = FV1.product_id 
            AND FV1.FieldDef_ID = '7'
            AND FV1.Value = 'value expected for 7'

         INNER JOIN fieldvals FV2
            ON P.id = FV2.product_id 
            AND FV2.FieldDef_ID = '8'
            AND FV2.Value = 'value expected for 8'

         INNER JOIN fieldvals FV3
            ON P.id = FV3.product_id 
            AND FV3.FieldDef_ID = '9'
            AND FV3.Value = 'value expected for 9'

         (continue same "join" sample above for as many
          criteria conditions you need to add... just keep
          incrementing the alias ... FV1, FV2, FV3, etc...)
   WHERE 
      P.Product_Name like '%your criteria%'
于 2013-06-26T17:24:48.447 に答える