@Osco

Как правильно написать SQL запрос для корректной работы фильтров в каталоге?

Есть набор фильтров по категориям:
63414d65add01859669112.jpeg

В БД это выглядит так:
63414f6ad7b84192014878.jpeg
При выборе, например таких параметров:
63415221e076e580950464.jpeg
Если перебирать все property_val_id с логическим или, получаем запрос типа:
SELECT actor_id FROM filters WHERE property_val_id IN (8,10,15,18)

Он работает, но не совсем корректно.
мы получим в выдаче всех рыжих ИЛИ безволосых ИЛИ африканцев ИЛИ худощавых
(как вы понимаете полные африканцы или худощавые белые тоже будут в выдаче)

А нужно чтобы мы получали: (РЫЖИХ ИЛИ БЕЗВОЛОСЫХ) И АФРИКАНЦА И ХУДОЩАВОГО

Помогите пожалуйста разобраться, может быть структура фильтров в общей куче выбрана не верно и нужно разбить (каждой категории отдельная таблица), либо правильно сформировать запрос, потому что запрос типа:

SELECT actor_id FROM filters WHERE property_val_id IN (8,10) AND property_val_id=15  AND property_val_id=18

естественно не дает требуемого результата...

P.S. Фильтры типа пола, локации и возраста находятся в отдельной таблице с самими людьми и работают как часики, склеиваясь в выдаче JOIN'ами, на них не обращайте внимания. Вопрос только по дополнительным фильтрам.
  • Вопрос задан
  • 68 просмотров
Пригласить эксперта
Ответы на вопрос 1
iMedved2009
@iMedved2009
Не люблю людей
select 
   * 
from 
    actors 
where (
                SELECT 
                  count(*) 
                FROM 
                  filters 
                WHERE  
                                ((property_val_id = 8 and property_id = 3) or 
                                  (property_val_id = 8 and property_id = 15) or 
                                  (property_val_id = 10 and property_id = 18)) 
                                and 
                                  actor_id = actors.id) = 3;


Или можно отсортировать по совпдаениям
select * from actors order by (SELECT count(*) FROM filters WHERE  ((property_val_id = 8 and property_id = 3) or (property_val_id = 8 and property_id = 15) or (property_val_id = 10 and property_id = 18)) and actor_id = actors.id) desc;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы