powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подсчитать количество товаров с выбранными характеристиками
5 сообщений из 5, страница 1 из 1
Подсчитать количество товаров с выбранными характеристиками
    #39700439
DrZeD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, подскажите как подсчитать товары если в фитре выбрано несколько значений

есть таблицы товаров (shop) и категорий
таблица дополнительных полей (fields)
таблица к каим категориям принадлежит дополнительное поле (field_category)
таблица значений дополнительных полей (fields_value)

Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE IF NOT EXISTS `fields` (
  `field_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL DEFAULT '',
 `is_filter` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`field_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;



Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE IF NOT EXISTS `field_category` (
  `field_category_id` int(11) NOT NULL AUTO_INCREMENT,
  `field_id` int(11) NOT NULL DEFAULT '0',
  `category_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`field_category_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;



Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE IF NOT EXISTS `fields_value` (
  `field_value_id` int(11) NOT NULL AUTO_INCREMENT,
  `field_id` int(11) NOT NULL DEFAULT '0',
  `parent_id` int(11) NOT NULL DEFAULT '0', // id продукции которой принадлежит значение (shop_id)
  `value` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`field_value_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;



Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE IF NOT EXISTS `shop` (
  `shop_id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) NOT NULL DEFAULT '0',
  `name` varchar(100) NOT NULL,
  PRIMARY KEY (`shop_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;



Делаю такой запрос что бы подсчитать количество товаров по разным характеристикам

Код: sql
1.
SELECT value, Count(value) as count FROM `fields_value` INNER JOIN `shop` on fields_value.field_id IN (1, 18) and fields_value.parent_id = shop.shop_id and shop.parent_id = '5' GROUP BY value Order By count desc



Теперь возник такой вопрос как подсчитать количество товаров если например указано значение дополнительного поля например Формат(fields.name): A4(fields_value.value) и Цвет(fields.name): желтый(fields_value.value)

фактически такой запрос выводит все что нужно

Код: sql
1.
SELECT * FROM `fields_value` INNER JOIN `shop` on fields_value.field_id IN (1, 18) and fields_value.parent_id = shop.shop_id and shop.parent_id = '5'



но если указать конкретные значения в условие

Код: sql
1.
SELECT * FROM `fields_value` INNER JOIN `shop` on fields_value.field_id IN (1, 18) and fields_value.parent_id = shop.shop_id and shop.parent_id = '5' and value='A4' and value= 'желтый'



то результат NULL что и логично, так как value может принимать только одно значение

как построить запрос что бы вывести товары которые удовлетворяли данным значениям?
...
Рейтинг: 0 / 0
Подсчитать количество товаров с выбранными характеристиками
    #39700468
DrZeD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
еще помучавшись пришел к такому результату

Код: sql
1.
SELECT fields_value.*, shop.* FROM `fields_value` JOIN `shop` on fields_value.field_id IN (1, 18) and fields_value.parent_id = shop.shop_id and shop.parent_id = '5' and (SELECT Count(*) FROM `fields_value` WHERE value='желтый' and parent_id = shop.shop_id) > 0 and (SELECT Count(*) FROM `fields_value` WHERE value='A4' and parent_id = shop.shop_id) > 0



он эффективен? или можно как-то упростить
...
Рейтинг: 0 / 0
Подсчитать количество товаров с выбранными характеристиками
    #39702679
DrZeD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сформировал запрос подсчета продукции по выбранным параметрам, считает нормально.

Код: sql
1.
SELECT fields.field_id, unit, fields.name, fields.url, value, Count(value) as count FROM `fields` LEFT JOIN `fields_value` on fields.field_id = fields_value.field_id and fields.is_filter = '1' INNER JOIN `shop` on fields_value.parent_id = shop.shop_id and shop.parent_id = '3' and (SELECT Count(*) FROM `fields_value` WHERE (value='250') and parent_id = shop.shop_id) > 0 and (SELECT Count(*) FROM `fields_value` WHERE (value='150') and parent_id = shop.shop_id) > 0 Group by fields.field_id, value



Возникла такая проблема в таблице fields_value получились значение для разных характеристик одинаковые и получается запрос не корректно выводит результат, как можно дополнительно указать в под запросе родителя значения

Код: sql
1.
SELECT fields.field_id, unit, fields.name, fields.url, value, Count(value) as count FROM `fields` LEFT JOIN `fields_value` on fields.field_id = fields_value.field_id and fields.is_filter = '1' INNER JOIN `shop` on fields_value.parent_id = shop.shop_id and shop.parent_id = '3' and (SELECT Count(*) FROM `fields_value` WHERE (value='250') and parent_id = shop.shop_id) > 0 and (SELECT Count(*) FROM `fields_value` WHERE (value='250') and parent_id = shop.shop_id) > 0 Group by fields.field_id, value



что-то типа такого приводит к нулевому резальтатут

Код: sql
1.
(SELECT Count(*) FROM `fields_value` WHERE (value='250') and parent_id = shop.shop_id and fields.field_id = fields_value.field_id) > 0
...
Рейтинг: 0 / 0
Подсчитать количество товаров с выбранными характеристиками
    #39702699
DrZeD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
такой под запрос нужно сделать, где fields.field_id ='1', то поле к которому принадлежит данное значение

Код: sql
1.
(SELECT Count(*) FROM `fields_value`, `fields` WHERE (value='A4') and parent_id = shop.shop_id and fields.field_id = fields_value.field_id and fields.field_id ='1') > 0
...
Рейтинг: 0 / 0
Подсчитать количество товаров с выбранными характеристиками
    #39702708
DrZeD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Самый большой запрос со всеми выбранными фильтрами выполняется чуть меньше секунды

Код: sql
1.
2.
3.
4.
5.
6.
7.
Select shop.name, shop.shop_id, shop.url, shop.recomend, shop.title, shop.short_text, shop.parent_id, shop.filename, shop.category, shop.price FROM `fields_value`, `shop`, `fields` 
WHERE fields.field_id = fields_value.field_id and fields.is_filter = '1' and fields_value.parent_id = shop.shop_id and shop.parent_id = '5' and shop.category IN (1,6) and 
(SELECT Count(*) FROM `fields_value`, `fields` WHERE (value='A3' or value='A4') and parent_id = shop.shop_id and fields.field_id = fields_value.field_id and fields.url='format') > 0 and 
(SELECT Count(*) FROM `fields_value`, `fields` WHERE (value='80' or value='160') and parent_id = shop.shop_id and fields.field_id = fields_value.field_id and fields.url='density') > 0 and 
(SELECT Count(*) FROM `fields_value`, `fields` WHERE (value='50' or value='100' or value='200' or value='250' or value='500') and parent_id = shop.shop_id and fields.field_id = fields_value.field_id and fields.url='kolichestvo_listov_v_pachke') > 0 and 
(SELECT Count(*) FROM `fields_value`, `fields` WHERE (value='ассорти' or value='голубой' or value='желтый' or value='зеленый' or value='кремовый' or value='оранжевый' or value='розовый' or value='серый' or value='слоновая кость' or value='черный') and parent_id = shop.shop_id and fields.field_id = fields_value.field_id and fields.url='color') > 0 
Group by shop.shop_id ORDER BY shop.news_date desc



такой же запрос через JOIN выполняется 1,3 секунды как-то странно

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Select shop.name, shop.shop_id, shop.url, shop.recomend, shop.title, shop.short_text, shop.parent_id, shop.filename, shop.category, shop.price FROM `shop` 
LEFT JOIN `fields_value` on fields_value.parent_id = shop.shop_id and shop.parent_id = '5' and shop.category IN (1,6)
LEFT JOIN  `fields` on  fields.field_id = fields_value.field_id and fields.is_filter = '1' and 
(SELECT Count(*) FROM `fields_value`, `fields` WHERE (value='A3' or value='A4') and parent_id = shop.shop_id and fields.field_id = fields_value.field_id and fields.url='format') > 0 and 
(SELECT Count(*) FROM `fields_value`, `fields` WHERE (value='80' or value='160') and parent_id = shop.shop_id and fields.field_id = fields_value.field_id and fields.url='density') > 0 and 
(SELECT Count(*) FROM `fields_value`, `fields` WHERE (value='50' or value='100' or value='200' or value='250' or value='500') and parent_id = shop.shop_id and fields.field_id = fields_value.field_id and fields.url='kolichestvo_listov_v_pachke') > 0 and 
(SELECT Count(*) FROM `fields_value`, `fields` WHERE (value='ассорти' or value='голубой' or value='желтый' or value='зеленый' or value='кремовый' or value='оранжевый' or value='розовый' or value='серый' or value='слоновая кость' or value='черный') and parent_id = shop.shop_id and fields.field_id = fields_value.field_id and fields.url='color') > 0 
Group by shop.shop_id ORDER BY shop.news_date desc
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подсчитать количество товаров с выбранными характеристиками
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]