В интернет-магазинах есть фильтры по товарам. Называют это, вроде как, Active Filtering.
Скажем, у нас есть ноутбуки (products). У ноутбуков много значений фильтров (product_filter_values), которые, в свою очередь, связаны с с типами фильтров (filter_types) и значениями фильтров (filter_values).
НОУТБУКИ (products)
Диагональ экрана (filter_types)
11 (filter_values)
13.3
15.6
Процессор
Intel
AMD
Теперь, скажем, мы хотим видет только ноутбуки с 11 и 13.3 диагональю, а так же не признаем AMD.
Казалось бы, все просто и задача самая типичная, но сейчас это работает таким ужасным образом:
SELECT products.id
FROM products
INNER JOIN
product_filter_values ON product_filter_values.product_id = products.id
WHERE
product_filter_values.filter_value_id IN (1,2)
INTERSECT
SELECT products.id
FROM products
INNER JOIN
product_filter_values ON product_filter_values.product_id = products.id
WHERE
product_filter_values.filter_value_id IN (4)
И хотя работает не так уж и медленно, но кажется костылем + нет удобного способа сделать нормальный фасетный поиск (что бы отображались плюсы, например: AMD (+3))
Должен же быть способ реализовать это с помощью Sphinx или аналогичного поискового движка?