вывод фильтров из таблицы с кол. продуктов 0

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

вывод фильтров из таблицы с кол. продуктов 0

Сообщение webplus »

Здравствуйте!
Пытаюсь реализовать sql запрос который выведет фильтры из таблицы с кол. товаров 0.
У меня выводит только если есть товары хоть я и через Left Join подключаю таблицу товаров, все равно она как главная работает.
вот запрос:

Код: Выделить всё

SELECT `po`.*, `po`.`value_ru` AS `value`, count(`shop_product`.id) AS `count_product` 
FROM `shop_product_option` `po` 
LEFT JOIN `shop_product` `shop_product` ON `shop_product`.id = po.product_id 
LEFT JOIN `shop_product_option` `po_razmer` ON `shop_product`.id=`po_razmer`.product_id 
LEFT JOIN `shop_product_option` `po_ves` ON `shop_product`.id=`po_ves`.product_id 
WHERE (`shop_product`.`category_id`=1) 
AND (`po`.`slug_option`='cvet') 
AND ((((`po_razmer`.`slug_option`='razmer') 
AND (`po_razmer`.`slug`='77')) 
AND (`po_ves`.`slug_option`='ves')) 
AND (`po_ves`.`slug`='180')) 
GROUP BY `po`.`slug`
Пробовал еще такой запрос, фильтры выводит все, но кол-во не верное

Код: Выделить всё

SELECT `po`.*, `po`.`value_ru` AS `value`, count(`shop_product`.id) AS `count_product` FROM `shop_product_option` `po` 
LEFT JOIN `shop_product_option` `po_razmer` ON (`po`.`product_id` = `po_razmer`.`product_id`) 
AND ((`po_razmer`.`slug_option`='razmer') 
AND (`po_razmer`.`slug`='77')) 
LEFT JOIN `shop_product_option` `po_ves` ON (`po`.`product_id` = `po_ves`.`product_id`) 
AND ((`po_ves`.`slug_option`='ves') 
AND (`po_ves`.`slug`='180')) 
LEFT JOIN `shop_product` `shop_product` ON `shop_product`.id = po.product_id 
WHERE (`shop_product`.`category_id`=1) AND (`po`.`slug_option`='cvet') 
GROUP BY `po`.`slug`
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: вывод фильтров из таблицы с кол. продуктов 0

Сообщение webplus »

unknownby писал(а): 2019.12.24, 16:48 Использовал having?
нет! а надо ли?
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: вывод фильтров из таблицы с кол. продуктов 0

Сообщение webplus »

unknownby писал(а): 2019.12.24, 16:55 Подставь в первый запрос

Код: Выделить всё

HAVING `count_product` = 0
подставил, вообще ничего не вывело!
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: вывод фильтров из таблицы с кол. продуктов 0

Сообщение webplus »

yiiliveext писал(а): 2019.12.24, 18:14 http://sqlfiddle.com/#!9/e623cb/1
Спасибо! Но я после как вы написали что неправильно построил таблицы- я переделал, сделал так чтобы в админки к товару динамически добавлялись характеристики. И если раньше при выборе фильтров галочками шла связь в таблицу связей товара с ИД фильтром. То сейчас такая структура таблицы:
Изображение
И когда я формирую фильтры мне приходится их по колонки slug группировать, чтобы одинаковые не повторялись.

Тот пример что вы дали мне понятен, но я ни пойму как мне по названию сгруппировать, а потом еще и по товарам сгруппировать чтобы кол-во товаров получить
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: вывод фильтров из таблицы с кол. продуктов 0

Сообщение yiiliveext »

Сделайте фидл с упрощенной схемой и небольшим набором тестовых данных (можно с бэкапа прямо взять) и опишите словами, что вам нужно выбрать.
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: вывод фильтров из таблицы с кол. продуктов 0

Сообщение webplus »

yiiliveext писал(а): 2019.12.24, 18:45 Сделайте фидл
сделал: http://sqlfiddle.com/#!9/33816c/4 Должно в цвете белом показать кол-во товаров 2, а у меня только 0 или 1 показывает.
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: вывод фильтров из таблицы с кол. продуктов 0

Сообщение yiiliveext »

webplus писал(а): 2019.12.24, 20:22
yiiliveext писал(а): 2019.12.24, 18:45 Сделайте фидл
сделал: http://sqlfiddle.com/#!9/33816c/4 Должно в цвете белом показать кол-во товаров 2, а у меня только 0 или 1 показывает.
Я не могу понять зачем вы туда пихаете параметр белый. Опишите словами, что вам нужно выбрать.
Я преполагаю, что надо вывести все фильтры у товаров из категории с айди 1 с количеством товаров по каждому фильтру, тогда вот так http://sqlfiddle.com/#!9/33816c/8
То, как вы сделали фильтры сейчас, кстати, еще хуже, чем было. Вынесите значения в отдельную таблицу shop_option_value
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: вывод фильтров из таблицы с кол. продуктов 0

Сообщение webplus »

yiiliveext писал(а): 2019.12.24, 22:37 Я преполагаю, что надо вывести все фильтры у товаров из категории с айди 1 с количеством товаров по каждому фильтру, тогда вот так http://sqlfiddle.com/#!9/33816c/8
Ваш запрос работает верно.
У меня в начале группы фильтров все получаю путем groupBy потом делаю цикл и в каждом цикле для каждой группы подставляю в запрос группу:

Код: Выделить всё

SELECT `po`.*, `po`.`value_ru` AS `value`, count(`shop_product`.id) AS `count_product` 
FROM `shop_product_option` `po` 
LEFT JOIN `shop_product` `shop_product` ON `shop_product`.id = po.product_id 
WHERE (`shop_product`.`category_id`=1) AND (`po`.`slug_option`='ves') 
GROUP BY `po`.`slug`
здесь подставляется группа `po`.`slug_option`='ves' т.е. для группы ves и так в цикле для каждой группы.
тут все верно вот результат:
Изображение

Но мне надо и я пытаюсь еще к фильтрам добавить запрос который исключит фильтры другой группы если в них нет связей с этими товарами (то есть товарами выбранного фильтра).
вот что делает мой запрос что я в фиде сделал http://sqlfiddle.com/#!9/33816c/4
Изображение - но кол-во не верно считает.

Запрос исключения добавляется так:
$_group['slug_option'] - это группа из цикла. - я выше писал что вначале все группы вывожу через groupBy а потом в цикле для каждой группы
выбираю фильтры и это исключение в этом цикле

Код: Выделить всё

            foreach ($filters_array as $group => $filter) {
                if ($group != $_group['slug_option']) {
                    $sqlSelectCount->leftJoin(ProductOption::tableName() . " `po_{$group}`", "shop_product.id=`po_{$group}`.product_id");
                    $sqlSelectCount->andWhere(["`po_{$group}`.slug_option" => $group]);
                    $sqlSelectCount->andWhere(['IN', "`po_{$group}`.slug", $filter]);
                }
            }
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: вывод фильтров из таблицы с кол. продуктов 0

Сообщение yiiliveext »

webplus писал(а): 2019.12.24, 23:04 У меня в начале группы фильтров все получаю путем groupBy потом делаю цикл и в каждом цикле для каждой группы подставляю в запрос группу:
здесь подставляется группа `po`.`slug_option`='ves' т.е. для группы ves и так в цикле для каждой группы.
Но зачем???? Если это все делается одним запросом?
Но мне надо и я пытаюсь еще к фильтрам добавить запрос который исключит фильтры другой группы если в них нет связей с этими товарами (то есть товарами выбранного фильтра).
вот что делает мой запрос что я в фиде сделал http://sqlfiddle.com/#!9/33816c/4
Изображение - но кол-во не верно считает.
http://sqlfiddle.com/#!9/33816c/45
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: вывод фильтров из таблицы с кол. продуктов 0

Сообщение yiiliveext »

Добавил товаров, примеры:
http://sqlfiddle.com/#!9/6dddbd/1 - применен один фильтр
http://sqlfiddle.com/#!9/6dddbd/2 - применено два фильтра

Обновил фидлы (в товарах слаги немного напутал)
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: вывод фильтров из таблицы с кол. продуктов 0

Сообщение webplus »

yiiliveext писал(а): 2019.12.24, 23:59 Добавил товаров, примеры:
http://sqlfiddle.com/#!9/6dddbd/1 - применен один фильтр
http://sqlfiddle.com/#!9/6dddbd/2 - применено два фильтра

Обновил фидлы (в товарах слаги немного напутал)
Спасибо большое!
запросы работают.
Но теперь как то я неправильно в ActiveRecord делаю. И немного неправильно работает

Код: Выделить всё

    private function getFilters($productsQuery, $filters_array)
    {
        $out = [];
        $groups = ProductOption::find()
            ->select([ProductOption::tableName() . '.*', ProductOption::tableName() . '.option_'.\Yii::$app->language . ' as group_option'])
            ->leftJoin($productsQuery->tablesUsedInFrom, $productsQuery->tablesUsedInFrom['{{shop_product}}'] . '.id = ' . ProductOption::tableName() . '.product_id')
            ->where($productsQuery->where)
            ->groupBy('group_option')
            ->orderBy('group_option ASC')
            ->asArray()
            ->all();
        $i = 0;
        foreach ($groups as $_group) {
            $out[$i]['parent'] = $_group['group_option'];
            $_productsQuery =  clone $productsQuery;

            $_productsQuery = clone $productsQuery;
            $alias = 'po';
            $query = ProductOption::find()->alias('po');
            foreach ($filters_array as $group => $filter) {
                if ($group != $_group['slug_option']) {
                    $query->joinWith(['productOption' => function($q) use ($filter, $group) {
                        return $q->alias("po_{$group}")
                            ->andOnCondition(['IN', "`po_{$group}`.slug", $filter])
                            ->andOnCondition(["`po_{$group}`.slug_option" => $group]);
                    }]);
                    $alias = "`po_{$group}`";
                } else {
                    $query->joinWith(['productOption' => function($q) use ($filter, $group) {
                        return $q->alias("po_{$group}")
                            ->andOnCondition(["`po_{$group}`.slug_option" => $group]);
                    }]);
                    $alias = "`po_{$group}`";
                }
            }
            //print $alias;die;
            $query->select(['po.*', 'po.value_'.\Yii::$app->language . ' as value', "count({$alias}.product_id) as count_product"])
                ->leftJoin($_productsQuery->tablesUsedInFrom, $_productsQuery->tablesUsedInFrom['{{shop_product}}'] . '.id = po.product_id')
                ->andWhere($_productsQuery->where)
                ->andWhere(['po.slug_option' => $_group['slug_option']])
                ->groupBy('po.slug');


            $out[$i]['filters'] = $query->asArray()->all();
            $i++;
        }

        return $out;
    }
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Аватара пользователя
webplus
Сообщения: 336
Зарегистрирован: 2012.02.24, 22:05

Re: вывод фильтров из таблицы с кол. продуктов 0

Сообщение webplus »

webplus писал(а): 2019.12.25, 00:54
yiiliveext писал(а): 2019.12.24, 23:59 Добавил товаров, примеры:
http://sqlfiddle.com/#!9/6dddbd/1 - применен один фильтр
http://sqlfiddle.com/#!9/6dddbd/2 - применено два фильтра

Обновил фидлы (в товарах слаги немного напутал)
все работает верно:
надо было лишний left join убрать

Код: Выделить всё

            $alias = 'po';
            $query = ProductOption::find()->alias('po');
            foreach ($filters_array as $group => $filter) {
                if ($group != $_group['slug_option']) {
                    $query->joinWith(['productOption' => function($q) use ($filter, $group) {
                        return $q->alias("po_{$group}")
                            ->andOnCondition(['IN', "`po_{$group}`.slug", $filter])
                            ->andOnCondition(["`po_{$group}`.slug_option" => $group]);
                    }]);
                    $alias = "`po_{$group}`";
                } else {
//                    $query->joinWith(['productOption' => function($q) use ($filter, $group) {
//                        return $q->alias("po_{$group}")
//                            ->andOnCondition(["`po_{$group}`.slug_option" => $group]);
//                    }]);
//                    $alias = "`po_{$group}`";
                }
            }
            //print $alias;die;
            $query->select(['po.*', 'po.value_'.\Yii::$app->language . ' as value', "count({$alias}.product_id) as count_product"])
                ->leftJoin($_productsQuery->tablesUsedInFrom, $_productsQuery->tablesUsedInFrom['{{shop_product}}'] . '.id = po.product_id')
                ->andWhere($_productsQuery->where)
                ->andWhere(['po.slug_option' => $_group['slug_option']])
                ->groupBy('po.slug');


            $out[$i]['filters'] = $query->asArray()->all();
Сайт по работе в Украине: https://jobis.com.ua/. Сайт по поиску строителей: https://stroyzakaz.com.ua/
Создание сайтов в Киеве: https://webplus.com.ua/ по доступной цене.
Ответить