Я работаю с сайтом по продаже товаров, где каждый товар в базе данных (MySQL) относится к нескольким категориям. Я использую сопоставление таблиц «многие ко многим» для хранения отношения продукта к категории.
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. Мой подход заключается в получении идентификаторов ProductID и CategoryID, которые появляются в запросе (например, "(1001 + 1002 | 1005)"):
SELECT ProductID, CategoryID FROM ProCatMap WHERE CategoryID IN (1001, 1002, 1005)
затем выполните окончательную фильтрацию в PHP.
После выбора записей ProductID-CategoryID я объединяю их в массив в следующем формате:
$ Relation [$ ProductID] = массив (CategoryID1, CategoryID2 .....); поэтому для данных, перечисленных выше, массив будет
$Relation[1] = array(1001,1002, 1003);
$Relation[2] = array(1001, 1003, 1005);
У меня вопрос: как мне кодировать, чтобы анализировать динамический логический запрос и выполнять фильтрацию в массиве?
Запрос состоит только из операторов И (+) и ИЛИ (|), а скобки всегда сбалансированы. (например, каждая открытая скобка должна иметь закрывающую скобку в запросе).
Любая помощь высоко ценится.