MНЫЙД INNER + HAVING поиск по множеству значений.

PN
На сайте с 01.05.2008
Offline
113
539

Есть база, со значениями, в ней есть страна, область, город, район. Все хранится в одной таблице, и есть parent значение, где например, КИЕВСКАЯ ОБЛАСТЬ ЯВЛЯЕТСЯ детем страны УКРАИНЫ.

По такому принципу база более 5000 значений. По ней есть поиск, с выбором этих характеристик у объявления.

Например, при заполнении указанных на картинке полей, идет такой запрос в БД:

(SELECT scp.`announcement_cat_page_id` , COUNT(*) as count FROM `announcement_catalog_page` AS `scp`
INNER JOIN announcement_cat_page_properties AS scpp ON scpp.announcement_cat_page_properties_producer_extend = scp.announcement_cat_page_producer_extend AND scpp.announcement_cat_page_properties_product_id = scp.announcement_cat_page_id AND (
CASE

WHEN announcement_cat_page_properties_parentid='1' THEN ( announcement_cat_page_properties_types_value_int='2' ) WHEN announcement_cat_page_properties_parentid='2' THEN ( announcement_cat_page_properties_types_value_int='14' ) WHEN announcement_cat_page_properties_parentid='3' THEN ( announcement_cat_page_properties_types_value_int='369' ) WHEN announcement_cat_page_properties_parentid='4' THEN ( announcement_cat_page_properties_types_value_int='6590' )

ELSE NULL
END


)


GROUP BY announcement_cat_page_id
HAVING count > 3
) Число 3- определяется количеством выбранных полей.

В выдаче будут все объявления у которых указаны данные свойства. Так оно работает, но мне надо так, что бы можно было указать не только одниг город, а несколько. Как это сделать?

например: announcement_cat_page_properties_types_value_int='2' - украна

announcement_cat_page_properties_types_value_int='14' - киевская область

announcement_cat_page_properties_types_value_int='369' - киев

Учитывая, что у объявлений может быть та же страна к множесту объявлений, то через OR (announcement_cat_page_properties_types_value_int='XX' OR announcement_cat_page_properties_types_value_int='YY' ) не работает. Выдаются и не нужные значения, напримре если указана украина, киевская область, и другой город, не Киев, то оно все равно будет показано.

Как сделать что бы выводились все значения, но с учетом наследий. Напрмиер если выбрана киевскя область, Киев, Печерский район, и Донецкая область, то что бы в выдаче выбрались толкько из ПЕЧЕРКСКОГО РАЙОНА (дети Киева, Области и Украины), и ДОНЕЦКОЙ ОБЛАСТИ. ?

HC
На сайте с 27.05.2013
Offline
3
#1

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

PN
На сайте с 01.05.2008
Offline
113
#2

Там по сути 3 таблицы. Одна с объявлением, вторая со свойствами которые доавбляются к обхявлению в виде ОБЛАСТи, СТРАНЫ, и т.п. Их к одному объявлению столько, сколько параметров задает посетитель. И третья таблица с самими параметрами (их перечнет) на рис. выше.

announcement_cat_page_properties

Данне к объявленим так выглядят в таблице

announcement_cat_page_properties_product_id - id продукта,

announcement_cat_page_properties_types_value_int - = ID того свойства к которому соотстветвует объявление, из таблицы выше,

announcement_cat_page_properties_id announcement_cat_page_properties_parentid announcement_cat_page_properties_producer_extend announcement_cat_page_properties_types_value_int announcement_cat_page_properties_types_value_text announcement_cat_page_properties_show announcement_cat_page_properties_product_id

1 1 4471 2 0 1

2 2 4471 14 0 1

3 3 4471 356 0 1

4 4 4471 6256 0 1

5 5 4471 122 0 1

6 6 4471 132 0 1

7 7 4471 151 0 1

8 1 4471 2 0 2

9 2 4471 19 0 2

10 3 4471 505 0 2

11 4 4471 10172 0 2

12 5 4471 124 0 2

13 6 4471 154 0 2

14 7 4471 151 0 2

15 1 4471 2 0 3

16 2 4471 14 0 3

17 3 4471 369 0 3

18 4 4471 6581 0 3

19 5 4471 122 0 3

20 6 4471 132 0 3

21 1 4471 2 0 4

22 2 4471 8 0 4

23 3 4471 211 0 4

24 4 4471 2525 0 4

25 5 4471 122 0 4

26 6 4471 133 0 4

Еще какие таблицы надо?

VHS-1980
На сайте с 21.05.2010
Offline
91
#3

Объявления появляются только при выборе третьего уровня вложенности? Всмысле район-село?

Просто таблица с параметрами/ и их значениями - это часть интерфейса. Никто же не мешает потом сделать

select * from objavleniya where region3urovnya in(spisok_vybrannyh_regionov)?

Если можно распишите организацию работы скрипта по шагам. По запросу видно, что вы просто пошли не тем путем при организации работы скрипта или структурировании данных - задача очень часто встречается и я просто не могу понять для чего у вас такие танцы с бубном сделаны.

Так же можно не считать количество, а в поля запроса вывести region1, region2, region3 и в WHERE строить условие

PN
На сайте с 01.05.2008
Offline
113
#4

А можно про последнее пример?

про организацию через @Так же можно не считать количество, а в поля запроса вывести region1, region2, region3 и в WHERE строить условие@, возможно я что-то упустил.

Такая организация для того, что бы при поиске можно было много уровней выбирать, ранее когда ИСКЛЮЧАЛИСЬ все что не соотвестуют выбранным - то было ок, а сейчас надо что бы можно было например, несколько стран выбрать. При этом если в стране выбраны дочерние области, то значит выводить только из указанных областей, и так далее, если выбран район то только из выбранных районов. Если не выбраны дочерние данные то выводить все... Идея такая.

Например, выбрас РОССИЯ, МОСКВА, вывести все из Москрвы, а если доп. стоит Украина Киев, то в итоге КИЕВ + МОСКВА в выдавче. А если Киев МОСКВА + БЕларусь то значит все что беларуси. Если через OR то практически т очто надо, за исключением того, что если выбран ДОЧЕРНИЙ ОБЪЕКТ то что бы не учитывать родителя

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий