SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 01.08.2017 21:53:12

pautinaweb
Участник
Зарегистрирован: 01.08.2017
Сообщений: 13

SQL запрос для вывода количества товаров в фильтре

Необходимо посчитать количество товаров в каждой категории после выбора нескольких параметров.
что то вроде того:


    Силуэт
    Бальные 3
    Ампир 2
    А-силуэт 1
    Бренд
    Наталья Романова 2
    Gabbiano 4
    Особенности
    Для беременных 4
    трансформер 5
    кружевные 1

Есть следующие таблицы

http://test-sw.ru/222.jpg

После выбора фильтра делаю выборку так:


SELECT DISTINCT product_id
FROM `productparameter`
WHERE `cat_id` = 1 AND parameter_id IN (4,7) AND `parameter_type` IN (1,3)
GROUP BY product_id HAVING count(*) = 2


Тут у нас выбрано два параметра Бренд и силует. Вроде всё нормально, а вот как вывести оставшиеся доступные параметры и посчитать количество, ну ни как не пойму.

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

SELECT  p.`id`,p.`name`,p.`type`, COUNT(pp.`product_id`) AS `count`
                      FROM `parameter` p
                      INNER JOIN `productparameter` pp ON pp.`parameter_id` = p.`id`
                      WHERE p.`cat` = 1
                      GROUP BY pp.`parameter_id`


Помогите пожалуйста продолжить условие, уже голову сломал. Заранее спасибо за ответ!

Неактивен

 

#2 01.08.2017 22:04:40

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: SQL запрос для вывода количества товаров в фильтре

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

Неактивен

 

#3 01.08.2017 22:50:32

pautinaweb
Участник
Зарегистрирован: 01.08.2017
Сообщений: 13

Re: SQL запрос для вывода количества товаров в фильтре

Тестовые данные


-- phpMyAdmin SQL Dump
-- version 4.5.1
-- <a href="http://www.phpmyadmin.net">http://www.phpmyadmin.net</a>
--
-- Хост: localhost
-- Время создания: Авг 01 2017 г., 22:37
-- Версия сервера: 5.7.9-log
-- Версия PHP: 5.6.15

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- База данных: `test`
--

-- --------------------------------------------------------

--
-- Структура таблицы `parameter`
--

CREATE TABLE `parameter` (
  `id` int(5) NOT NULL,
  `shortname` varchar(50) DEFAULT NULL,
  `cat` tinyint(4) NOT NULL DEFAULT '0',
  `type` tinyint(4) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Дамп данных таблицы `parameter`
--

INSERT INTO `parameter` (`id`, `shortname`, `cat`, `type`) VALUES
(4, 'Бальные', 1, 1),
(5, 'Ампир', 1, 1),
(6, 'Наталья Романова', 1, 3),
(7, 'Gabbiano', 1, 3),
(8, 'Для беременных', 1, 9),
(9, 'трансформер', 1, 9),
(10, 'Недорогие', 1, 5),
(11, 'средние', 1, 5),
(12, 'дорогие', 1, 5),
(13, 'А-силуэт', 1, 1),
(14, 'прямое', 2, 1),
(15, 'Cabbiano Fairy Tale', 1, 4),
(16, 'кружевные ', 1, 9);

-- --------------------------------------------------------

--
-- Структура таблицы `product`
--

CREATE TABLE `product` (
  `id` int(4) NOT NULL,
  `cat` tinyint(4) DEFAULT NULL,
  `name` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Дамп данных таблицы `product`
--

INSERT INTO `product` (`id`, `cat`, `name`) VALUES
(9, 1, 'Бальное  платье от Gabbiano'),
(10, 1, 'Бальное  платье от Gabbiano'),
(11, 1, 'Ампир платье от Gabbiano'),
(12, 1, 'А силуэт платье от Натальи Романовой '),
(13, 1, 'Ампир платье от Натальи Романовой'),
(14, 1, 'Бальное  платье от Gabbiano  коллекция Fariy Tale, трансформер'),
(15, 2, 'Вечернее платье 1'),
(16, 2, 'Вечернее платье прямое 2');

-- --------------------------------------------------------

--
-- Структура таблицы `productparameter`
--

CREATE TABLE `productparameter` (
  `id` int(11) NOT NULL,
  `cat_id` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  `product_id` int(11) UNSIGNED NOT NULL DEFAULT '0',
  `parameter_id` int(11) UNSIGNED NOT NULL DEFAULT '0',
  `parameter_type` tinyint(3) UNSIGNED NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Дамп данных таблицы `productparameter`
--

INSERT INTO `productparameter` (`id`, `cat_id`, `product_id`, `parameter_id`, `parameter_type`) VALUES
(101, 2, 16, 14, 1),
(102, 2, 15, 14, 1),
(138, 1, 13, 5, 1),
(139, 1, 13, 6, 3),
(140, 1, 13, 12, 5),
(141, 1, 13, 9, 9),
(142, 1, 13, 8, 9),
(147, 1, 11, 5, 1),
(148, 1, 11, 7, 3),
(149, 1, 11, 11, 5),
(150, 1, 11, 9, 9),
(151, 1, 11, 8, 9),
(152, 1, 10, 4, 1),
(153, 1, 10, 7, 3),
(154, 1, 10, 10, 5),
(155, 1, 10, 9, 9),
(156, 1, 10, 8, 9),
(157, 1, 9, 4, 1),
(158, 1, 9, 7, 3),
(159, 1, 9, 10, 5),
(160, 1, 14, 4, 1),
(161, 1, 14, 7, 3),
(162, 1, 14, 15, 4),
(163, 1, 14, 12, 5),
(164, 1, 14, 9, 9),
(170, 1, 12, 13, 1),
(171, 1, 12, 6, 3),
(172, 1, 12, 11, 5),
(173, 1, 12, 16, 9),
(174, 1, 12, 9, 9),
(175, 1, 12, 8, 9);

--
-- Индексы сохранённых таблиц
--

--
-- Индексы таблицы `parameter`
--
ALTER TABLE `parameter`
  ADD PRIMARY KEY (`id`);

--
-- Индексы таблицы `product`
--
ALTER TABLE `product`
  ADD PRIMARY KEY (`id`);

--
-- Индексы таблицы `productparameter`
--
ALTER TABLE `productparameter`
  ADD PRIMARY KEY (`id`),
  ADD KEY `parameter_id` (`parameter_id`),
  ADD KEY `cat_id` (`cat_id`);

--
-- AUTO_INCREMENT для сохранённых таблиц
--

--
-- AUTO_INCREMENT для таблицы `parameter`
--
ALTER TABLE `parameter`
  MODIFY `id` int(5) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=17;
--
-- AUTO_INCREMENT для таблицы `product`
--
ALTER TABLE `product`
  MODIFY `id` int(4) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=17;
--
-- AUTO_INCREMENT для таблицы `productparameter`
--
ALTER TABLE `productparameter`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=176;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

 



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

Под доступными параметрами я имел ввиду это:

Допустим я выбрал платья по одному бренду (Gabbianо) и выбрал еще два силуэта (Бальные и Ампир) и у меня должно остаться в (боксе с фильтрами) только те параметры по которым можно продолжить фильтрацию, если таковые имеются.
А  те которые не соответствуют заданным фильтрам и товаров по ним 0 стали например серыми.
В принципе стандартная ситуация с фильтрами товаров.

То есть мне нужно написать запрос для бокса с фильтрами

Отредактированно pautinaweb (01.08.2017 22:52:12)

Неактивен

 

#4 01.08.2017 23:40:22

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: SQL запрос для вывода количества товаров в фильтре

SELECT  p.`id`,p.`shortname`,p.`type`, COUNT(pp.`product_id`) AS `count`
                      FROM `parameter` p
                      JOIN `productparameter` pp ON pp.`parameter_id` = p.`id`
                      WHERE p.`cat` = 1 and pp.product_id in (SELECT product_id FROM `productparameter` WHERE `cat_id` = 1 AND parameter_id IN (4,7) AND `parameter_type` IN (1,3) GROUP BY product_id HAVING count(*) = 2)
                      GROUP BY pp.`parameter_id`;

Неактивен

 

#5 02.08.2017 00:24:52

pautinaweb
Участник
Зарегистрирован: 01.08.2017
Сообщений: 13

Re: SQL запрос для вывода количества товаров в фильтре

Я сделал не много по другому без вложенного запроса

Сначала  я делаю выборку товара


SELECT DISTINCT product_id FROM `productparameter`
WHERE `cat_id` = 1 AND parameter_id IN (4,7) AND `parameter_type` IN (1,3)
GROUP BY product_id HAVING count(*) = 2
 


Тоесть у нас получается 3 товара с ID 9,10,14
потом ID продуктов использую в IN уже в формировании самого блока с фильтрами и там же считаю количество оставшихся


SELECT p.`id`,p.`shortname`,p.`type`,p.`url`, COUNT(pp.`product_id`) AS `count`
FROM `parameter` p
INNER JOIN `productparameter` pp ON pp.`parameter_id` = p.`id`
WHERE p.`cat` = 1 AND pp.`product_id` IN(9,10,14)
GROUP BY pp.`parameter_id`
 


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

тоесть про выборе бальные платься у нас пропадают все силуэты

http://test-sw.ru/555.jpg


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

Отредактированно pautinaweb (02.08.2017 00:28:47)

Неактивен

 

#6 02.08.2017 00:51:42

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: SQL запрос для вывода количества товаров в фильтре

pautinaweb написал:

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

тоесть про выборе бальные платься у нас пропадают все силуэты

у товаров 9,10,14 нет параметров 5,13 и т.д. (которые соответствуют другим силуэтам).
т.е. исчезают только те параметры, по которым дальнейшая фильтрация точно не возможна.
добавьте данные в productparameter и увидите другую картину

Неактивен

 

#7 02.08.2017 01:11:58

pautinaweb
Участник
Зарегистрирован: 01.08.2017
Сообщений: 13

Re: SQL запрос для вывода количества товаров в фильтре

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

Неактивен

 

#8 02.08.2017 01:20:58

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: SQL запрос для вывода количества товаров в фильтре

условию Бальные и Gabbiano соответствуют товары № 9,10 и 14
дальше фильтрация может идти только среди этих товаров
у этих товаров нет других силуэтов, потому они и не отображаются
остаются только те параметры, по которым возможна дальнейшая фильтрация

т.е. все работает правильно

Неактивен

 

#9 02.08.2017 02:17:29

pautinaweb
Участник
Зарегистрирован: 01.08.2017
Сообщений: 13

Re: SQL запрос для вывода количества товаров в фильтре

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

Неактивен

 

#10 02.08.2017 02:36:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: SQL запрос для вывода количества товаров в фильтре

вот есть тестовые данные, пользователь выбирает параметры 4 и 7.
что именно должен вернуть запрос?

Неактивен

 

#11 02.08.2017 20:10:28

pautinaweb
Участник
Зарегистрирован: 01.08.2017
Сообщений: 13

Re: SQL запрос для вывода количества товаров в фильтре

Ну товары с ID 9,10 и 14.
Вывод товаров то нормально работает, проблема в выводе боксов

Пока вижу в цикле подсчитывать каждый параметр в боксе который соответствует выбранным чекбоксам

Но по моему это как то слишком. Это куча запросов даже если отмечен один чекбокс

Неактивен

 

#12 03.08.2017 01:46:36

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: SQL запрос для вывода количества товаров в фильтре

непонятно что значит "вывод боксов"
в терминах базы, какой набор значений должен вернуть запрос для указанных выше тестовых данных, когда пользователь выбирает параметры 4 и 7?

Неактивен

 

Board footer

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