Получить всю информацию о продуктах по категориям - SQL? - PullRequest
1 голос
/ 27 ноября 2011

Так как это лучшая страница, которую я когда-либо встречал в случае подобных вопросов, я хочу задать это здесь Я немного запутался здесь. Я новичок в выражениях SQL, поэтому мне нужна ваша помощь, пожалуйста. У меня есть три таблицы:

  • продукт
  • product_category
  • product_to_category

Я показываю вам экспортированный файл SQL, так что вы можете получить это:

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 utf8 */;

CREATE TABLE IF NOT EXISTS `product` (
  `productID` int(6) NOT NULL AUTO_INCREMENT,
  `productTitle` varchar(255) NOT NULL,
  `productDescription` text NOT NULL,
  `productPrice` double NOT NULL DEFAULT '0',
  `productQuantity` int(5) NOT NULL,
  PRIMARY KEY (`productID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

INSERT INTO `product` (`productID`, `productTitle`, `productDescription`, `productPrice`, `productQuantity`) VALUES
(1, 'Chlor 5L', 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. \r\n\r\nDuis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. \r\n\r\nUt wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. \r\n\r\nNam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. \r\n\r\nDuis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. ', 14.95, 50),
(2, 'Chlor 15L', 'Mit diesem Kanister kommen Sie etwa 27.000 Liter aus.', 50, 13),
(3, 'Chlor 20L', 'Mit diesem Kanister kommen Sie etwa 37.000 Liter aus.', 60, 2),
(4, 'Chlor 25L', 'Mit diesem Kanister kommen Sie etwa 47.000 Liter aus.', 79, 11),
(5, 'Kieselgur 50kg', 'Eine menge Kieselgur zum säubern.', 69.99, 9);


CREATE TABLE IF NOT EXISTS `product_category` (
  `categoryID` int(3) NOT NULL AUTO_INCREMENT,
  `categoryName` varchar(255) NOT NULL,
  `categoryDescription` text NOT NULL,
  PRIMARY KEY (`categoryID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;


INSERT INTO `product_category` (`categoryID`, `categoryName`, `categoryDescription`) VALUES
(1, 'Schwimmbecken', 'Hier finden Sie alle Produkte rund um das Thema Schwimmbecken.'),
(2, 'Whirlpool', 'Hier finden Sie alle Produkte rund um das Thema Whirlpools.'),
(3, 'Sauna', 'Hier finden Sie alle Produkte rund um das Thema Sauna.'),
(4, 'Infrarot', 'Hier finden Sie alle Produkte rund um das Thema Infrarotkabinen.');


CREATE TABLE IF NOT EXISTS `product_to_category` (
  `categoryID` int(3) NOT NULL,
  `productID` int(6) NOT NULL,
  `productAddedTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`categoryID`,`productID`),
  KEY `productID` (`productID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `product_to_category` (`categoryID`, `productID`, `productAddedTime`) VALUES
(1, 1, '2011-11-27 13:57:12'),
(1, 2, '2011-11-27 13:57:12'),
(1, 3, '2011-11-27 13:57:12'),
(1, 4, '2011-11-27 13:57:12'),
(1, 4, '2011-11-27 13:57:12'),
(2, 1, '2011-11-27 13:57:12');

ALTER TABLE `product_to_category`
  ADD CONSTRAINT `product_to_category_ibfk_2` FOREIGN KEY (`categoryID`) REFERENCES `product_category` (`categoryID`),
  ADD CONSTRAINT `product_to_category_ibfk_3` FOREIGN KEY (`productID`) REFERENCES `product` (`productID`);

/*!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 */;

Итак, я хочу сделать следующее: я хочу получить всю информацию обо ВСЕХ продуктах. Я хочу сгруппировать их на одной странице по категориям. Кроме того, я хочу показать количество продуктов в каждой категории. Я не знаю, как это сделать. С этим утверждением я получаю правильное количество товаров по категориям, но только по продукту. Но я хочу получить всю информацию о продуктах ВСЕХ продуктов во ВСЕХ категориях, надеюсь, я изложил свою точку зрения, в противном случае вы можете спросить еще раз. Я пытаюсь это объяснить.

SELECT COUNT(ptc.productID) AS productCount, pc.categoryName, p.productTitle, p.productPrice 
FROM product_category pc
JOIN product_to_category ptc ON pc.categoryID = ptc.categoryID
JOIN product p ON ptc.productID = p.productID
GROUP BY pc.categoryName

Надеюсь, у вас есть ответ для меня ...

Хочу, чтобы я хотел сделать это обзор, как это:

Schwimmbecken (5 products)    
 - Chlor 5L (14.95)
 - Chlor 15L (50.00)
 - Chlor....

Whirlpool (1 product)  
 - Chlor 5L (14.95)

Надеюсь, этого было достаточно, чтобы показать тебе ...

Ответы [ 2 ]

1 голос
/ 27 ноября 2011

использование (исправленная версия)

SELECT DISTINCT
c.categoryName || '(' || c.cnt || ' products)' title,
x.productTitle || '(' || x.productPrice || ')' productinfo
FROM
(
select 
pc.categoryid, 
pc.categoryName, 
count(distinct p2c.productID) cnt 
from product_category pc 
INNER JOIN product_to_category p2c ON p2c.categoryid = pc.categoryid
group by pc.categoryid, pc.categoryName
) c
INNER JOIN 
(
SELECT DISTINCT
ptc.categoryid, 
p.productTitle, 
p.productPrice
FROM product p
INNER JOIN product_to_category ptc ON p.productID = ptc.productID
) x ON x.categoryid = c.categoryid
ORDER BY 1, 2

Это даст то, о чем вы просите, за исключением одного - title будет повторяться так же часто, как и продукты в соответствующей категории ... эта часть не может быть обработана с помощью самого SQL, вам придется обработайте это в своем коде ...

РЕДАКТИРОВАТЬ - согласно комментариям:

Приведенный выше выбор выполняет внутреннее объединение между двумя SELECTs ... первый получает по одной строке на категорию плюс количество товаров в этой категории ... второй получает все продукты в категории ... они объединяются через categoryid ...

Только что попробовал это с вашими примерами данных и получил следующий результат:

TITLE                   PRODUCTINFO

Schwimmbecken(4 products)   Chlor 15L(50)
Schwimmbecken(4 products)   Chlor 20L(60)
Schwimmbecken(4 products)   Chlor 25L(79)
Schwimmbecken(4 products)   Chlor 5L(14,95)
Whirlpool(1 products)       Chlor 5L(14,95)

Кстати: ваши данные выборки кажутся отключенными ... у вас есть два раза productId 4 в categoryID 1, в то время как productID 5 нигде не используется ...

1 голос
/ 27 ноября 2011

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

SELECT COUNT(p.productID) AS productCount, c.categoryName, p.productTitle, p.productPrice 
FROM product p 
JOIN product_to_category ptc ON ptc.categoryID = p.productID
JOIN category c ON ptc.catgeory_id = c.categoryID 
ORDER BY c.categoryName

Startпри этом изучите результаты, а затем добавьте группировку при необходимости.

...