SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 04.10.2016 07:01:28

lancelot8097
Участник
Зарегистрирован: 04.10.2016
Сообщений: 4

Выбрать категории где 0 продуктов

Добрый день подскажите что делаю не так.

Есть 3 таблици

1 category 1 000 записей
c_id
c_name

2 product 400 000 записей
p_id
p_name

3 category_to_product 1 500 000 отношений
c_id
p_id

Надо выбрать категорию где количество продуктов равно 0.

Делаю вот такой запрос

SELECT
       `category`.*,
        count(`product`.`p_id`) as `p_count`,
                FROM `category`
                LEFT JOIN category_to_productON (category.c_id = category_to_product.c_id)
                JOIN product ON (product.p_id = category_to_product.p_id)
                        GROUP BY `category_id`.`c_id`



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

Отредактированно lancelot8097 (04.10.2016 07:13:47)

Неактивен

 

#2 04.10.2016 08:27:56

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

Re: Выбрать категории где 0 продуктов

select category.*
FROM `category`
                LEFT JOIN category_to_product ON (category.c_id = category_to_product.c_id)
where category_to_product.c_id is null
group by `category_id`.`c_id`; -- все категории у которых нет продуктов.



lancelot8097 написал:

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

JOIN product оставит только те где есть продукты

lancelot8097 написал:

К тамуже запрос выполняется около 8 секунд что по мне очень долго.

показывайте:
план запрооса
explain select ...;

и структуру таблиц в виде
show create table имя_таблицы;

Неактивен

 

#3 04.10.2016 11:22:01

lancelot8097
Участник
Зарегистрирован: 04.10.2016
Сообщений: 4

Re: Выбрать категории где 0 продуктов

vasya написал:

select category.*
FROM `category`
                LEFT JOIN category_to_product ON (category.c_id = category_to_product.c_id)
where category_to_product.c_id is null
group by `category_id`.`c_id`; -- все категории у которых нет продуктов.



lancelot8097 написал:

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

JOIN product оставит только те где есть продукты

lancelot8097 написал:

К тамуже запрос выполняется около 8 секунд что по мне очень долго.

показывайте:
план запрооса
explain select ...;

и структуру таблиц в виде
show create table имя_таблицы;


explain
SELECT
    `Lst_Cat`.`CatId`,
    `Lst_Cat`.`name`
        FROM `Lst_Cat`
        INNER JOIN `Lst_GoodsToCat` ON(`Lst_Cat`.`CatId` = `Lst_GoodsToCat`.`CatId`)
        LEFT JOIN `Lst_Goods` ON(`Lst_Goods`.`GoodId` = `Lst_GoodsToCat`.`GoodId`)
            WHERE `Lst_Goods`.`GoodId`IS NULL
                group by `Lst_Cat`.`CatId`;

799 rows in set (7.31 sec)
 



+----+-------------+----------------+------------+---------+----------------+----------------------+---------+--------------------------------+----------+----------+----------------------------------------------+
| id | select_type | table               | partitions | type    | possible_keys | key                      | key_len | ref                                  | rows      | filtered  | Extra                                        |
+----+-------------+----------------+------------+---------+----------------+----------------------+---------+--------------------------------+----------+----------+----------------------------------------------+
|  1 | SIMPLE      | Lst_GoodsToCat | NULL       | index  | NULL             | UK_Lst_GoodsToCat | 8         | NULL                                | 1408344 |   100.00 | Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | Lst_Cat            | NULL       | eq_ref | PRIMARY        | PRIMARY               | 4         | listex.Lst_GoodsToCat.CatId  |          1 |   100.00  | NULL                                         |
|  1 | SIMPLE      | Lst_Goods        | NULL       | eq_ref | PRIMARY        | PRIMARY               | 4         | listex.Lst_GoodsToCat.GoodId|          1 |   100.00  | Using where; Not exists; Using index         |
+----+-------------+----------------+------------+---------+----------------+----------------------+---------+--------------------------------+----------+-----------+----------------------------------------------+
 

Неактивен

 

#4 04.10.2016 11:32:35

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

Re: Выбрать категории где 0 продуктов

а зачем показывать план неверного запроса? вам ведь нужны категории, не имеющие товаров?

Неактивен

 

#5 04.10.2016 11:37:56

lancelot8097
Участник
Зарегистрирован: 04.10.2016
Сообщений: 4

Re: Выбрать категории где 0 продуктов

vasya написал:

а зачем показывать план неверного запроса? вам ведь нужны категории, не имеющие товаров?

Так это и есть те 799 категорий без товаров
Просто почем-то без приклейки товара не получается получить null от pivot


mysql> desc Lst_cat;
+------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          |
+------------------+--------------+------+-----+---------+----------------+
| CatId                  | int(11)          | NO    | PRI | NULL    | auto_increment |
| CategoryParentId | int(11)          | YES  |        | NULL    |                |
| Name                  | varchar(255) | YES   |       | NULL    |                |
+------------------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> Desc Lst_goods;
+---------+--------------+------+-----+---------+----------------+
| Field     | Type            | Null | Key | Default | Extra             |
+---------+--------------+------+-----+---------+----------------+
| GoodId | int(11)         | NO   | PRI | NULL    | auto_increment |
| Name   | varchar(250) | YES  |       | NULL    |                        |
+---------+---------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> desc Lst_GoodsToCat;
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| GoodToCatId | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| GoodId         |  int(11)              | NO   | MUL | 0        |                |
| CatId            | int(11)               | NO   |        | 0        |                |
+-------------+------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
 

Неактивен

 

#6 04.10.2016 11:49:33

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

Re: Выбрать категории где 0 продуктов

о каком пивоте идет речь?

категория без товара - это категория, которая есть в Lst_cat, но отсутствует в Lst_GoodsToCat?

зачем в Lst_GoodsToCat нужно поле GoodToCatId?
Сделайте составной индекс на два других

Неактивен

 

#7 04.10.2016 12:13:02

lancelot8097
Участник
Зарегистрирован: 04.10.2016
Сообщений: 4

Re: Выбрать категории где 0 продуктов

vasya написал:

о каком пивоте идет речь?

категория без товара - это категория, которая есть в Lst_cat, но отсутствует в Lst_GoodsToCat?

зачем в Lst_GoodsToCat нужно поле GoodToCatId?
Сделайте составной индекс на два других

Вот что происходит когда я делаю просто.


mysql> explain                                                                                                                                                                                              
    -> SELECT Lst_Cat.*                                                                                                                                                                                    
    ->  FROM Lst_Cat                                                                                                                                                                                        
    ->          LEFT JOIN Lst_GoodsToCat as cp ON(Lst_Cat.CatId = cp.CatId)                                                                                                                                
    ->          WHERE cp.CatId IS NULL                                                                                                                                                                      
    ->         ;                                                                                                                                                                                            
+----+-------------+---------+------------+-------+---------------+-------------------+---------+------+---------+----------+-----------------------------------------------------------------------------+
| id | select_type | table   | partitions | type  | possible_keys | key               | key_len | ref  | rows    | filtered | Extra                                                                       |
+----+-------------+---------+------------+-------+---------------+-------------------+---------+------+---------+----------+-----------------------------------------------------------------------------+
|  1 | SIMPLE      | Lst_Cat | NULL       | ALL   | NULL          | NULL              | NULL    | NULL |    1425 |   100.00 | NULL                                                                        |
|  1 | SIMPLE      | cp      | NULL       | index | NULL          | UK_Lst_GoodsToCat | 8       | NULL | 1408344 |    10.00 | Using where; Not exists; Using index; Using join buffer (Block Nested Loop) |
+----+-------------+---------+------------+-------+---------------+-------------------+---------+------+---------+----------+-----------------------------------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)                                                                                                                                                                        
                                                                                                                                                                                                           
 

Неактивен

 

#8 04.10.2016 12:18:52

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

Re: Выбрать категории где 0 продуктов

давайте по порядку: что такое категория без товара и находит ли их мой запрос?

Неактивен

 

Board footer

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