Как пересчитать количество товаров в MySQL, которых нет в наличии

78
06 марта 2022, 11:10

Есть 2 таблицы: qgqn_categories и qgqn_products

qgqn_categories qgqn_products

В qgqn_categories есть categoryID и products_count, который выводит не правильное количество товаров потому, что товар может быть out_of_stock, но при этом со статусом enabled. Поэтому модуль его записывает в products_count.

В таблице qgqn_products есть productID, categoryID, in_stock

Возникла идея связать данные этих таблиц в 1 SQL запрос и получить список пустых категорий, но нет достаточного опыта, как это правильно сделать.

Я так понимаю нужно пересчитать количество товаров, которых нет в наличии и потом как-то сопоставить ID категорий.

Подскажите пожалуйста, потому что там я так предполагаю и JOIN придется затронуть

Но чувствую, что-то пошло не так)))

CREATE TABLE `qgqn_categories` (
  `categoryID` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `parent` int(11) DEFAULT NULL,
  `products_count` int(11) DEFAULT NULL,
  `description` text,
  `picture` varchar(30) DEFAULT NULL,
  `products_count_admin` int(11) DEFAULT NULL,
  `sort_order` int(11) DEFAULT '0',
  `viewed_times` int(11) DEFAULT '0',
  `allow_products_comparison` int(11) DEFAULT '0',
  `allow_products_search` int(11) DEFAULT '1',
  `show_subcategories_products` int(11) DEFAULT '1',
  `meta_description` text,
  `meta_keywords` text,
  `title` text,
  `subcount` int(11) DEFAULT '0',
  PRIMARY KEY (`categoryID`),
  KEY `IDX_CATEGORIES1` (`parent`),
  KEY `SORT_ORDER` (`sort_order`)
) ENGINE=InnoDB AUTO_INCREMENT=95507 DEFAULT CHARSET=cp1251;
INSERT INTO `qgqn_categories` VALUES (1,'Главная категория',NULL,8110,NULL,NULL,25431,0,939560,0,1,1,NULL,NULL,NULL,0),(94724,'ООО "Орион"',1,297,'','',428,1,101224,0,1,1,'','','',0),(94729,'Батарейки',1,4,'','',31,28,3197,0,1,1,'','','',0),(94730,'Все для праздника',1,12,'','',122,29,6573,0,1,1,'','','',2),
CREATE TABLE `qgqn_products` (
  `productID` int(11) NOT NULL AUTO_INCREMENT,
  `categoryID` int(11) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `description` text,
  `customers_rating` float DEFAULT '0',
  `Price` double DEFAULT NULL,
  `Price_opt1` double DEFAULT NULL,
  `Price_opt2` double DEFAULT NULL,
  `Price_opt3` double DEFAULT NULL,
  `Price_opt4` double DEFAULT NULL,
  `in_stock` int(11) DEFAULT NULL,
  `customer_votes` int(11) DEFAULT '0',
  `items_sold` int(11) NOT NULL,
  `enabled` int(11) DEFAULT NULL,
  `brief_description` text,
  `list_price` double DEFAULT NULL,
  `list_price_opt` double DEFAULT NULL,
  `product_code` varchar(25) DEFAULT NULL,
  `sort_order` int(11) DEFAULT '0',
  `default_picture` int(11) DEFAULT NULL,
  `date_added` datetime DEFAULT NULL,
  `date_modified` datetime DEFAULT NULL,
  `viewed_times` int(11) DEFAULT '0',
  `eproduct_filename` varchar(255) DEFAULT NULL,
  `eproduct_available_days` int(11) DEFAULT '5',
  `eproduct_download_times` int(11) DEFAULT '5',
  `weight` float DEFAULT '0',
  `meta_description` text,
  `meta_keywords` text,
  `free_shipping` int(11) DEFAULT '0',
  `min_order_amount` int(11) DEFAULT '1',
  `shipping_freight` double DEFAULT '0',
  `classID` int(11) DEFAULT NULL,
  `title` text,
  PRIMARY KEY (`productID`),
  KEY `IDX_PRODUCTS1` (`categoryID`)
) ENGINE=InnoDB AUTO_INCREMENT=2066272 DEFAULT CHARSET=cp1251;
INSERT INTO `qgqn_products` VALUES (2003458,94724,'А/м Бетономешалка песч.(16)','Компания “Орион” является одним из ведущих европейских производителей  детских пластмасовых игрушек. Более 25 лет мы радуем ваших детей безупречным качеством изделий и широким ассортиментом продукции. Современные технологии, квалифицированные специалисты и свежие идеи помогают компании удерживать лидирующие позиции на рынке игрушек Украины и Зарубежья.\nНаша команда профессиональных дизайнеров и конструкторов создают уникальные модели, что делает нашу продукцию узнаваемой и востребованной не только в Украине, но и далеко за ее пределами. Также при изготовлении продукции мы используем высококачественное сырье и экологически-чистые материалы без химических примесей, вредных для здоровья малышей.',1,124.2,82.8,0,0,0,888,2,0,1,'<table><tbody><tr><td>Гарантия</td><td>14 дней</td></tr><tr><td>Тип</td><td>Бетономешалка</td></tr><tr><td>Тематика</td><td>Спецтехника</td></tr><tr><td>Категория</td><td>Игрушки для мальчиков</td></tr><tr><td>Материал</td><td>пластик</td></tr><tr><td>Размер</td><td>365 x 175 x 240 мм</td></tr><tr><td>Производитель</td><td>Орион</td></tr><tr><td>К-во штук в упаковке,ящике(опт)</td><td>16 шт.</td></tr><tr><td>Пол</td><td>Для мальчиков</td></tr><tr><td>Возраст</td><td>от 3 лет</td></tr></tbody></table>',0,0,'00000002590',0,18426713,'2018-05-21 16:29:47','2019-12-18 06:28:23',1125,'',7,5,0,'','',0,1,0,0,'А/м Бетономешалка песч.(16)'),(2003459,94724,'А/м Камакс - Н комунальная машина (27)','Компания “Орион” является одним из ведущих европейских производителей  детских пластмасовых игрушек. Более 25 лет мы радуем ваших детей безупречным качеством изделий и широким ассортиментом продукции. Современные технологии, квалифицированные специалисты и свежие идеи помогают компании удерживать лидирующие позиции на рынке игрушек Украины и Зарубежья.\nНаша команда профессиональных дизайнеров и конструкторов создают уникальные модели, что делает нашу продукцию узнаваемой и востребованной не только в Украине, но и далеко за ее пределами. Также при изготовлении продукции мы используем высококачественное сырье и экологически-чистые материалы без химических примесей, вредных для здоровья малышей.',0,51.8,34.56,0,0,0,888,0,0,1,'<table><tbody><tr><td>Тип</td><td>Машинка</td></tr><tr><td>Тематика</td><td>Спецтехника</td></tr><tr><td>Размер</td><td>250 x 95 x 137 мм</td></tr><tr><td>К-во штук в упаковке,ящике(опт)</td><td>27 шт.</td></tr><tr><td>Пол</td><td>Для мальчиков</td></tr><tr><td>Возраст</td><td>от 3 лет</td></tr></tbody></table>',0,0,'00000007720',0,18426712,'2018-05-21 16:29:47','2019-12-18 06:28:23',843,'',0,0,0,'','',0,1,0,0,'А/м Камакс - Н комунальная машина (27)'),

В результате список пустых категорий:

Category Name => Product Count
`qgqn_categories`.name => 0
`qgqn_categories`.name => 0
`qgqn_categories`.name => 0
Answer 1

В зависимости от того, что тебе нужно можно пойти разными способами.

1) Если тебе нужно список всех категорий, даже если у него нет товара в таблице qgqn_products, тогда можно просто отсеять все категории, в которых присутствует товар.

SELECT distinct `qgqn_categories`.name AS Category_Name
FROM `qgqn_categories`
WHERE `qgqn_categories`.categoryID not in (
    select categoryID
    from `qgqn_products`
    where `qgqn_products`.in_stock > 0
)
  and `qgqn_categories`.parent > 1;

2) Если же тебе важно чтобы была запись в таблице qgqn_products, тогда можно модернизировать твой запрос, чтобы выбирать только те товары, по которым есть записи в обеих таблицах

SELECT `qgqn_categories`.name AS Category_Name
FROM `qgqn_products`
         INNER JOIN
     `qgqn_categories` ON `qgqn_categories`.categoryID = `qgqn_products`.categoryID
WHERE `qgqn_categories`.parent > 1 -- я так понимаю это условие нужно лично тебе в данном кейсе
GROUP BY `qgqn_products`.categoryID
HAVING SUM(`qgqn_products`.in_stock) = 0;
Answer 2

В общем, задачу решил таким способом

SELECT
    `qgqn_categories`.name AS Category_Name, SUM(if(`qgqn_products`.in_stock > 0, 1, 0)) AS Product_Count
FROM
    `qgqn_products`
INNER JOIN
    `qgqn_categories` ON `qgqn_categories`.categoryID = `qgqn_products`.categoryID
WHERE
    `qgqn_categories`.parent > 1
GROUP BY
    `qgqn_products`.categoryID
ORDER BY
    Product_Count ASC

Результат

20/40 МАКСИ => 0
Дартс => 0
Блокноты, закладки => 0
2 в 1 CONTOUR (9*15 элементов) => 0
Электромобили => 0
READ ALSO
Как проверить наличие установленного Python на компьютере с помощью Java?

Как проверить наличие установленного Python на компьютере с помощью Java?

Пишу программу,которая запускаетpy скрипт в фоне через GUI на Java

91
Как в Thymeleaf вписать в th:utext html-тэг с классом?

Как в Thymeleaf вписать в th:utext html-тэг с классом?

Такая проблема: Когда я пытаюсь реализовать данный код, то у меня все внутри подчеркивается красным и я не знаю как исправить это:

187
Не загружается ресурсы spring application сервере томкат удаленном хосте

Не загружается ресурсы spring application сервере томкат удаленном хосте

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

147
Открытие нового окна из отдельного потока

Открытие нового окна из отдельного потока

У меня есть "параллельный" поток, класс расширяемый с помощью Task<Void>В методе call() есть вызов нового объекта, который должен открыть новое...

204