私は、データベース(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(|)演算子と角括弧のみで構成され、角括弧は常にバランスが取れています。 (たとえば、開いている括弧はクエリ内に括弧を入れていなければなりません)。
ご協力いただきまして誠にありがとうございます。
あなたのご意見をお寄せください。 SQLでフィルタリングを行うのはまったく問題ありません。私は、入力クエリをSQLまたは一連のPHP条件に「翻訳」して、SQLまたはPHPでフィルタリングを実行する方法を説明します。私はRegExpで試しましたが、再帰的に何かを行うことはできません。 – LazNiko