SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.05.2011 01:06:16

Sasha_ch
Участник
Зарегистрирован: 14.05.2011
Сообщений: 18

Проблема с написанием запроса MySQL - вывод фильтров по свойствам товаров

Прошу "помощь зала", т.к. свой мозг иссяк за 3 дня мозговой деятельности.. Поиск не помог. (много тем схожих но везде данный аспект не затронут)

база MySQL
+родственный мне PHP (хотя не внем тут проблема)

Есть упрощенно такая структура таблиц (каталог товаров, с фильтрацией по характеристикам):


CREATE TABLE categories (category_id, ... );
CREATE TABLE products (product_id, category_id, ...);
CREATE TABLE properties (property_id, category_id, ...);
CREATE TABLE values(value_id, value)
CREATE TABLE properties_values (product_id, value_id,category_id); // где category_id - больше вспомогательное поле



Запрос который возвращает список айдишников на товары я додумался написать:

SELECT product_id FROM products as p WHERE p.category_id = '100' AND p.product_id IN
(SELECT product_id FROM properties_values WHERE value_id =948 AND product_id IN
(SELECT product_id FROM properties_values WHERE value_id =959 AND product_id IN
(SELECT product_id FROM properties_values WHERE value_id =954 OR value_id =953 )
)
) GROUP BY p.product_id


Список всех фильтров для конкретной категории (например с айди=100):

SELECT pv.value_id, count(pv.value_id)
FROM products as p, properties_values as pv
WHERE p.category_id = '100' AND p.product_id= pv.product_id
GROUP BY pv.value_id

проблема с выводом самого списка фильтров.. вот как пример здесь слева:
http://rozetka.com.ua/notebooks/c80004/ … l_core_i7/

какой запрос написать чтобы отображались актуальные значения фильтра, после к примеру выбора 1-го или более значений... ??


http://rozetka.com.ua/notebooks/c80004/ … l_core_i7/
- просьба обратить внимание, на часть фильтра "Процессор":
Intel Core i5 (+222) - товары которые сейчас отображены - не имеют этих свойств! но фильтра предлагаются!
Intel Core i3 (+227)

Неактивен

 

#2 14.05.2011 17:33:05

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблема с написанием запроса MySQL - вывод фильтров по свойствам товаров

Кажется, это проблема таки PHP smile Вы должны для себя определиться с тем,
что отображать, и делать соответствующие запросы к базе. В частности, в
том фильтре отображаются просто все доступные виды процессоров.

Неактивен

 

#3 15.05.2011 01:24:47

Sasha_ch
Участник
Зарегистрирован: 14.05.2011
Сообщений: 18

Re: Проблема с написанием запроса MySQL - вывод фильтров по свойствам товаров

Возможно в итоге приду к выводу что все-таки Вы правы, но взгляните..

вот к примеру тот же фильтр, только я выбрал в добавок еще "память=8гб"
http://rozetka.com.ua/notebooks/c80004/ … 0863=1034/

- часть серий процессоров УЖЕ показывается как "0"...

тут также аналогично:
http://protoria.ua/laptops-accessories/ … p1379v2275


тут аналогичная логика:
http://hotline.ua/gd/12/9890/
(только параметры для которых 0 предложений просто не отображаются)




..все это наводит меня на мысль что это как-то "стандартно, красиво" реализуется...

Отредактированно Sasha_ch (15.05.2011 01:25:46)

Неактивен

 

#4 15.05.2011 01:45:08

Sasha_ch
Участник
Зарегистрирован: 14.05.2011
Сообщений: 18

Re: Проблема с написанием запроса MySQL - вывод фильтров по свойствам товаров

допустим посетитель выбрал "Intel Core i7", -> ему отображаются только модели товаров у которых есть именно такое значение в свойстве "процессор".

Уже именно для этих товаров, я МОГУ вывести фильтры по всем свойствам/значениям которыми обладают отобранные товары, и просчитать для каждого значения - количество товаров (из отобранных) обладающих этим параметром  (и параметрами выбранными до этого, если они были выбраны).
- Но в этих фильтрах не будет естественно "Core i5" - т.к. нет таких моделей ноутбуков у которых и i5 и i7 )

Тоесть логика получается у меня: что я вывожу в фильтрах только те свойства и значения которыми обладают товары из таблицы products, у которых value_id=22  (допустим 22 - это айдишник значения Core i7)

а дальше у меня идет просто сплошной "блин" какойто... - а какая у них логика то?? %)

Отредактированно Sasha_ch (15.05.2011 01:55:34)

Неактивен

 

#5 15.05.2011 01:48:42

Sasha_ch
Участник
Зарегистрирован: 14.05.2011
Сообщений: 18

Re: Проблема с написанием запроса MySQL - вывод фильтров по свойствам товаров

мне эта задачка уже напоминает какую-то задачу с олимпиады по математике ... )
вроде сначала (по не внимательности) кажется просто, а потом понимаешь что не совсем ))

Неактивен

 

#6 15.05.2011 01:51:05

Sasha_ch
Участник
Зарегистрирован: 14.05.2011
Сообщений: 18

Re: Проблема с написанием запроса MySQL - вывод фильтров по свойствам товаров

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

...возможно я ошибаюсь.. но пока "не верю" )

Неактивен

 

#7 15.05.2011 02:19:00

Sasha_ch
Участник
Зарегистрирован: 14.05.2011
Сообщений: 18

Re: Проблема с написанием запроса MySQL - вывод фильтров по свойствам товаров

возможно будет проще думать глядя на заполненную таблицу:


categories (category_id, name)
____________100______ноутбуки
____________101______сумки


products (product_id, category_id, name);
____________1_________100_____Toshiba A100
____________2_________100_____Toshiba A200
____________3_________100_____Toshiba A300
____________4_________100_____Toshiba A400


properties (property_id, category_id, ...);
____________1________100__________ //процессор
____________2________100__________ //память


values(value_id, value, category_id)
________950_____2GB______100
________951_____4GB______100
________952_____8GB______100
________953_____i5________100
________954_____i7________100


properties_values (product_id, value_id,category_id,property_id);
__________________1__________950_____100______2 // 2GB
__________________1__________953_____100______1 // i5
__________________2__________951_____100______2 // 4GB
__________________2__________953_____100______1 // i5
__________________3__________952_____100______2 // 8GB
__________________3__________954_____100______1 // i7
__________________4__________952_____100______2 // 8GB
__________________4__________954_____100______1 // i7


...головоломка в: выбрать значения фильтров для товаров у которых value_id=954, и притом чтобы в фильтр попал value_id=953 !!! Как??

Отредактированно Sasha_ch (15.05.2011 14:27:35)

Неактивен

 

#8 15.05.2011 12:10:58

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблема с написанием запроса MySQL - вывод фильтров по свойствам товаров

Я понял, вы хотите чиселки возле фильтров. Чиселки надо считать, ничего с этим не поделаешь.
Ноль появляется тогда, когда при подсчете текущих параметров фильтров + установленном новом
получается ноль строк smile А сами фильтры рисуются независимо.

Неактивен

 

#9 15.05.2011 13:47:00

Sasha_ch
Участник
Зарегистрирован: 14.05.2011
Сообщений: 18

Re: Проблема с написанием запроса MySQL - вывод фильтров по свойствам товаров

paulus написал:

Чиселки надо считать, ничего с этим не поделаешь

согласен. возможно даже через count(value_id) ...

paulus написал:

Ноль появляется тогда, когда при подсчете текущих параметров фильтров + установленном новом
получается ноль строк

так.. счас часок помозгую над этим... у меня каждая даже косвенная идея вызывает подозрение на возможное решение моей уже глобальной проблемы )

Неактивен

 

#10 15.05.2011 14:28:38

Sasha_ch
Участник
Зарегистрирован: 14.05.2011
Сообщений: 18

Re: Проблема с написанием запроса MySQL - вывод фильтров по свойствам товаров

в таблицу properties_values добавил столбец property_id

Неактивен

 

#11 15.05.2011 17:02:28

Sasha_ch
Участник
Зарегистрирован: 14.05.2011
Сообщений: 18

Re: Проблема с написанием запроса MySQL - вывод фильтров по свойствам товаров

paulus написал:

Я понял, вы хотите чиселки возле фильтров. Чиселки надо считать, ничего с этим не поделаешь.
Ноль появляется тогда, когда при подсчете текущих параметров фильтров + установленном новом
получается ноль строк smile А сами фильтры рисуются независимо.

сори, у меня ну ничего толкового пока не выходит... у Вас случаем не было какой-то идеи-алгоритма как это реализовать?
хотя бы какой результат SELECTа к какому прибавлять/отнимать...?

ну тупо получать спискок всех value_id для всей категории, и потом перебором делать по каждому value_id селект который возвратит к-во товаров для него - это ж вроде не дело получается...

Отредактированно Sasha_ch (15.05.2011 17:04:12)

Неактивен

 

#12 19.05.2011 01:44:16

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Проблема с написанием запроса MySQL - вывод фильтров по свойствам товаров

Конечно. У вас есть некоторый текущий фильтр. По нему выбирается N товаров.
Если пользователь выберет еще и другой процессор, то фильтр будет чуть другим,
и по нему выберется M товаров. Вот M - N надо написать в скобочках smile

Почему получается не дело — не понимаю. Если аккуратно расставить индексы
(а где-то и денормализовать), то это вполне реальная задачка.

Неактивен

 

#13 22.07.2011 15:59:27

Sasha_ch
Участник
Зарегистрирован: 14.05.2011
Сообщений: 18

Re: Проблема с написанием запроса MySQL - вывод фильтров по свойствам товаров

Извиняюсь, немного вылетел из работы над этой задачей, сейчас вернулся к этому, и вспомнил что я не отписал ответ здесь... (
Хочу сказать что в итоге именно так и пришлось сделать. (сейчас доделываю уже)

то есть получилось:
1. Запрос который получает все свойства которые есть у товаров в этой категории.
Если выбраны какие-то "фильтра" у пользователя, то:
2. Запрос всех свойств для товаров которые имеют свойства заданные пользователем.
3. Последовательно селект по каждому заданному пользователем фильтру.
   получается,если пользователь задействовал 10 фильтров (крайне исключительная ситуация), то будет +10 отдельных запросов.

...и потом небольшая арифметика.

Хочу поблагодарить за помощь, хотя по началу как то не верилось что придется так накручено делать...
думал полегче будет решение )

Отредактированно Sasha_ch (22.07.2011 16:01:21)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson