Подбор заявок подходящих под условие

176
15 декабря 2016, 15:54

Есть заявки, у заявки есть параметры, каждый параметр в своей таблице. Надо выбрать заявки которые подходят под условия. (те для where всё известно) Всё вроде просто, но глаз уже замылился, где-то туплю.

В разных заявках может быть указано разное кол-во параметров.

пример из жизни это — подобрать под объект из рубрики «сдам», объявы из рубрики «сниму» (тех кто хочет снять)

схема

допустим:

заявка #1
prop1 = 25 и 6
prop2 = 5

заявка #2
prop1 = 25

при исходном условии:
prop1 = 25 надо выбрать 2 заявки
prop2 = 5 выбрать 1ю заявку
prop2 = 7 не выбирать ни одной
prop3 = 6 не выбирать ни одной

Answer 1

Насколько я понимаю, это вариант реализации EAV. Не сильно удачный прямо скажем, ну да ладно.

Вам нужно составить запрос по заявкам со всевозможными параметрами, что-то типа:

select r.id, r.title
  p1.value as p1value,
  p2.value as p2value,
  ...
  pn.value as pnvalue
from request r
  left join prop1 p1 on r.id = p1.req_id
  left join prop2 p2 on r.id = p2.req_id
  ...
  left join propn pn on r.id = pn.req_id

Запрос такой проще всего было бы формировать циклом, но не знаю какие у вас там реальные имена таблиц и отличаются ли поля, в любом случае такой запрос нужно уметь собирать. А если количество таблиц параметров у вас фиксированное, то можно и захардкодить его в конце концов (при этом, понятное дело, теряется смысл EAV, но тоже ладно)...

Дальше просто добавляете фильтр этому запросу:

where
  p1.value in (1,3,7)
  and p2.value > 10
  ...
  and pn.value between 30 and 40

ну понятно фильтры могут быть любые - по одному или нескольким параметрам. Смысл в том, что если параметра, по которому идет фильтр, нет у заявки, то она отбросится, а если есть, то отфильтруется по значению.

Чтобы подбирать заявки "сниму" под заявку "сдам" и наоборот, просто берете значения для фильтра по необходимым параметрам и подставляете в запрос выше в условия.

Answer 2

Вы уж не обессудьте, я, признаться, в вашей схеме со всеми этими prop1, prop2 и prop3 мало что понял. Тем не менее, исходя из ранее означенного условия про "сдать" - "снять" я бы сделал примерно так:

  1. Завел бы таблицу пользователей (тех, кто размещает объявления о сдаче или съемке)
  2. Завел бы таблицу типов сдаваемых/снимаемых объектов (квартира однокомнатная, квартира двухкомнатная, хижина трёхкомнатная и тд)
  3. Завел бы стаблицу-связку для связи предыдущих двух таблиц. В ней, помимо первичного ключа, создал бы два внешних на две вышеуказанные таблицы, а также поля "Тип предложения" (сдать или снять) и "Цена"

Далее для того, чтобы "подобрать под объект из рубрики «сдам», объявы из рубрики «сниму»" нужно сделать простой join с указанием типа интересующей недвижимости и, возможно, ценовой вилки. Для пущей нормализованности можно разнести по отдельным таблицам типы недвижимости (квартира, комната, коттедж) и ее атрибуты (однокомнатная, двухкомнатная и тд), вынести в отдельную таблицу тип предложения (сдам, сниму, куплю, продам)

Не знаю, насколько моя модель соответствует вашей предметной области, но все же надеюсь, чем-то помог

Answer 3

используйте вложенные запросы.

SELECT ... FROM table1 WHERE ... IN (SELECT ... FROM ...);
READ ALSO
Как реализовать фильтр слов?

Как реализовать фильтр слов?

Есть таблица "фразы" с полем "фраза"Есть таблица "фильтр" с полем "слово"

183
Как подключить файл «install.php» к базе данных MySQL

Как подключить файл «install.php» к базе данных MySQL

Ребята, помогите пожалуйста разобратьсяЯ в програмировании разбираюсь очень плохо, и потому обращаюсь к вам

130
Какой MySQL запрос быстрее?

Какой MySQL запрос быстрее?

из двух таблиц, имеющих одинаковое количество записей, с общим полем необходимо выбрать данные (по строчке из таблицы)как быстрее это сделать:...

139