@victorib_us

Как упростить sql запрос ?

Здравствуйте, есть таблица со значениями характеристик в таком виде:

id_page-----id_field-----value
1-------------11-----------100
1-------------22-----------Платный
1-------------33-----------есть
2-------------11-----------100
2-------------22-----------Платный
2-------------33-----------нет
3-------------11-----------200
3-------------22-----------Платный
3-------------33-----------нет

Задача написать sql запрос для взаимоисключающего фильтра по таблице с такой структурой.
Например человек задал первое условие для фильтрации со значением "Платный" (получил id_page=1,2,3 ) после полученных результатов добавляет еще одно условие для фильтрации по значению "100" (получил id_page=1,2) и добавляет третье условие по значению "есть" ( остается id_page=1)

Вопрос в том как правильно получить такой результат одним sql запросом ?
У меня получился вот такой запрос:
SELECT `id_page` FROM `fields_value` WHERE `value` ='есть' AND `id_page` IN (
	SELECT `id_page` FROM `fields_value` WHERE `value` ='100' AND `id_page` IN (
		SELECT `id_page` FROM `fields_value` WHERE `value` ='Платные'
    )
)

Такой запрос работает правильно и результат показывает верный но насколько такой выход правильный ?
То есть допустим в таблице будет не 3 возможных id_page а скажем 1-2 тысячи а условий для фильтрации не 3 а штук 10, не будет ли такой запрос слишком долгим в подобных условиях ? если вообще выполнится.
Если есть другой вариант то посоветуйте пожалуйста.
  • Вопрос задан
  • 2873 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT DISTINCT `res`.`id_page` FROM `fields_value` AS `res`
  INNER JOIN `fields_value` AS `f1` ON (`f1`.`id_page` = `res`.`id_page` AND `f1`.`id_field` = 22 AND `f1`.`value` = 'Платный')
  INNER JOIN `fields_value` AS `f2` ON (`f2`.`id_page` = `res`.`id_page` AND `f2`.`id_field` = 11 AND `f2`.`value` = '100')
  INNER JOIN `fields_value` AS `f3` ON (`f3`.`id_page` = `res`.`id_page` AND `f3`.`id_field` = 33 AND `f3`.`value` = 'есть')
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы