@kiberchainik
начинающий найкрутейшЫй програмЁр

Как наисать условие where с множесвом параметров?

SELECT a.*, ai.name_img_file, ai.src, ai.title as img_title 
FROM adverts as a, advert_imgs as ai, adverts_fields as af 
WHERE a.id = ai.id_adv and a.id = af.id_advert 
    AND af.field_name = 'storey_apartament'
    AND af.field_value = '58'
    AND af.field_name = 'condition_house' 
    AND af.field_value = '13'
    AND af.field_name = 'Sleeping'
    AND af.field_value = '38'
    AND af.field_name = 'Availability'
    AND af.field_value = '48'
    AND af.field_name = 'Bathroom'
    AND af.field_value = '77'
    AND af.field_name = 'Heating'
    AND af.field_value = '26'
    AND af.field_name = 'Furnished'
    AND af.field_value = '14'
    AND af.field_name = 'kitchen_area'
    AND af.field_value = '34'
ORDER BY `title` DESC


данные в базе есть, подстановка значений для af.field_name и af.field_value данный запрос должен выдать 1 запись, но не выдает ничего, просто нуль, как переписать этот запрос?
  • Вопрос задан
  • 61 просмотр
Решения вопроса 1
@alexalexes
SELECT a.*, ai.name_img_file, ai.src, ai.title as img_title 
FROM adverts as a
join  advert_imgs as ai on a.id = ai.id_adv 
WHERE 1 = 1
    AND exists( select 1 from adverts_fields af where a.id = af.id_advert and  af.field_name = 'storey_apartament' AND af.field_value = '58')
    AND  exists( select 1 from adverts_fields af where a.id = af.id_advert and af.field_name = 'condition_house' AND af.field_value = '13')
    AND  exists( select 1 from adverts_fields af where a.id = af.id_advert and af.field_name = 'Sleeping'AND af.field_value = '38')
    AND  exists( select 1 from adverts_fields af where a.id = af.id_advert and af.field_name = 'Availability' AND af.field_value = '48')
    AND  exists( select 1 from adverts_fields af where a.id = af.id_advert and  af.field_name = 'Bathroom' AND af.field_value = '77')
    AND  exists( select 1 from adverts_fields af where a.id = af.id_advert and af.field_name = 'Heating'AND af.field_value = '26')
    AND  exists( select 1 from adverts_fields af where a.id = af.id_advert and af.field_name = 'Furnished' AND af.field_value = '14')
    AND  exists( select 1 from adverts_fields af where a.id = af.id_advert and af.field_name = 'kitchen_area' AND af.field_value = '34')
ORDER BY `title` DESC

У вас свойства одного объекта "a" хранятся не в одной записи "af", а в нескольких, которые связаны внешним ключом через af.id_advert. Поэтому, чтобы посмотреть каждое свойство фильтра, нужно подзапросом exists пройтись по таблице свойств столько раз, сколько критериев в фильтре.
А то, что вы написали - то проверит одну запись свойства и отсечет выборку на следующем AND проверки критериев, поскольку field_name и field_value в одной цепочке and проверит на разные значения, но обратить такую цепочку and в true невозможно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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