2010-11-19 21 views
0

私は、データベース(MySQL)の各製品がいくつかのカテゴリに属している商品販売Webサイトで働いています。私は多対多のテーブルマッピングを使用して、商品カテゴリの関係を保存します。複雑な論理式を解析し、PHPで検索を行います

ProductID CategoryID 
1   1001 
1   1002 
1   1003 
2   1001 
2   1003 
2   1005 

このアプローチは、カテゴリ別の一般的な商品検索では非常に簡単です。

ただし、内部ユーザーは複雑な論理式でカテゴリ別に製品を検索します。 例:カテゴリー(1001 AND 1002)OR(1005)に属する商品を検索するために「(1001 + 1002)| 1005」と入力すると、

と入力します。カテゴリ "(1001 AND 1002)OR(1003 AND 1004)"に属する製品を検索するために "(1001 + 1002)|(1003 + 1004)"を入力します。

クエリが動的なので、SQLに直接変換するのは良くないと思います。

SELECT ProductID, CategoryID FROM ProCatMap WHERE CategoryID IN (1001, 1002, 1005) 

その後、PHPでの最終フィルタリングを実行します。|(たとえば、「1005年)(+ 1002 1001」)私のアプローチは、クエリに表示されProductIDsとCategoryIDsを取得することです。

ProductID-CategoryIDレコードを選択した後、次の形式の配列に結合します。 $関係[$ ProductID] =配列(CategoryID1、CategoryID2 .....);その上に挙げたデータのために、配列は

$Relation[1] = array(1001,1002, 1003); 
$Relation[2] = array(1001, 1003, 1005); 

私の質問はどのように私は動的論理クエリを解析し、アレイ上でフィルタリングを行うコードべきであるだろう。

クエリはAND(+)とOR(|)演算子と角括弧のみで構成され、角括弧は常にバランスが取れています。 (たとえば、開いている括弧はクエリ内に括弧を入れていなければなりません)。

ご協力いただきまして誠にありがとうございます。

答えて

0

正直言って、アプローチを再考して、データベースがこのようなフィルタリングを行う方法を理解する必要があります。これは、RDBMが設計したものです。 PHP(または一般的なプログラミング言語)でこのようなことをすることは、ホイールを再発明することであり、エラーの可能性が非常に高いでしょう。

すでに解析ロジックを下げている(+とAND)と交差(|とOR)すると結合が生成されるようです。それで行こう。

+0

あなたのご意見をお寄せください。 SQLでフィルタリングを行うのはまったく問題ありません。私は、入力クエリをSQLまたは一連のPHP条件に「翻訳」して、SQLまたはPHPでフィルタリングを実行する方法を説明します。私はRegExpで試しましたが、再帰的に何かを行うことはできません。 – LazNiko

関連する問題