разобрать сложное логическое выражение и выполнить поиск в php - PullRequest
0 голосов
/ 19 ноября 2010

Я работаю с сайтом по продаже товаров, где каждый товар в базе данных (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);

У меня вопрос: как мне кодировать, чтобы анализировать динамический логический запрос и выполнять фильтрацию в массиве?

Запрос состоит только из операторов И (+) и ИЛИ (|), а скобки всегда сбалансированы. (например, каждая открытая скобка должна иметь закрывающую скобку в запросе).

Любая помощь высоко ценится.

1 Ответ

0 голосов
/ 19 ноября 2010

Честно говоря - вам следует пересмотреть подход и найти способ для базы данных выполнить такую ​​фильтрацию за вас. Это то, для чего предназначены RDBM. Выполнение чего-то подобного в PHP (или любом общем языке программирования) будет заново изобретать колесо и, скорее всего, весьма подвержено ошибкам.

Кажется, у вас уже есть логика синтаксического анализа вниз (+ и AND), которая приведет к пересечению (| и OR), что приведет к объединению. Иди с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...