我正在与一个商品销售网站,每个产品在数据库(MySQL)属于几个类别。我使用多对多表映射来存储产品类别关系。解析复杂的逻辑表达式并执行搜索,在php
ProductID CategoryID
1 1001
1 1002
1 1003
2 1001
2 1003
2 1005
我认为这种方法对于按类别进行的一般产品搜索是相当直接的。
但是,内部用户将在复杂的逻辑表达式中按类别搜索产品。 例如:
输入“(1001 + 1002)| 1005”查找属于类别(1001和1002)或(1005)的产品。 输入“(1001 + 1002)|(1003 + 1004)”查找属于类别(1001和1002)或(1003和1004)的产品。
由于查询是动态的,我认为将其直接转换为SQL并不好。我的做法是检索出现在查询中ProductIDs和CategoryIDs(例如 “(1001 + 1002 | 1005)”):
SELECT ProductID, CategoryID FROM ProCatMap WHERE CategoryID IN (1001, 1002, 1005)
然后做在PHP中最后筛选。
在我选择ProductID-CategoryID记录后,我将它们按以下格式组合成一个数组: $ Relation [$ ProductID] = array(CategoryID1,CategoryID2 .....);因此对于上面列出的数据,该阵列将是
$Relation[1] = array(1001,1002, 1003);
$Relation[2] = array(1001, 1003, 1005);
我的问题是,应该怎么代码来解析动态逻辑查询并做阵列上的滤波。
查询只包含AND(+)和OR(|)运算符和括号,并且括号总是平衡的。 (例如,每个开放式括号在查询中必须有一个闭括号)。
任何帮助,高度赞赏。
Thx为您的建议。在SQL中进行过滤是完全正确的。我关心的是如何将输入查询“翻译”为SQL或一系列PHP条件,以便我可以在SQL或PHP中执行过滤。我尝试过使用RegExp,但它不能递归执行某些操作。 – LazNiko 2010-11-19 08:03:27