按类别获取产品的所有信息-SQL?

按类别获取产品的所有信息-SQL?,sql,count,group-by,sql-order-by,categories,Sql,Count,Group By,Sql Order By,Categories,因为这是我在遇到这样的问题时找到的最好的一页,我想在这里问一下。我有点困惑。我是SQL语句的初学者,所以我需要你的帮助。我有三张桌子: 产品 产品类别 产品类别 我向您展示了导出的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 @O

因为这是我在遇到这样的问题时找到的最好的一页,我想在这里问一下。我有点困惑。我是SQL语句的初学者,所以我需要你的帮助。我有三张桌子:

产品 产品类别 产品类别 我向您展示了导出的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)

希望这足以向你展示…

我想你已经接近了,但我会从产品或类别开始。 我会从产品开始,链接到产品类别,然后链接到分类,例如:

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
首先,检查结果,然后根据需要添加分组。

使用正确的版本

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
这将给你什么要求,除了一件事-标题将被重复,因为有产品在各自的类别。。。该部分不能通过SQL本身处理,您必须在代码中处理它

编辑-根据评论:

上面的选择在两个选择之间进行内部连接。。。first为每个类别获取一行加上该类别中的产品计数。。。第二个获得每个类别的所有产品。。。这些通过类别ID连接

仅使用示例数据进行了尝试,结果如下:

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)

顺便说一句:您的示例数据似乎不正确。。。您在类别ID 1中有两次使用productId 4,而productId 5没有在任何地方使用…

为了更清楚,请显示一些示例数据和想要的结果…我希望您可以处理我上次的编辑。您显示的结果与您提供的示例数据不匹配-例如:14.50来自哪里?数据只有14.95?你说得对。这个例子是错误的,当然应该是14.95。请看下面我的答案…我是这样开始的,但这给了我同样的结果。。。我在这个类别中得到了正确数量的产品,但只有一个产品…你试过分组吗?比如说pc.category_id?现在我看到了您的输出,我可以看到您可能希望有一个内部选择,例如选择col1、col2、col3、从tbl中选择字段、连接到现有表别名、col4、col5样式的“细节”行。哇,这看起来很可怕。。。我在我的phpMyAdmin平台上测试了这个。结果只显示了一行。productCount是5,categoryName=Schwimmecken,productTitle=Chlor 5L,productPrice=14.95——但我想要这一类别中所有产品的这些信息……嗯,这更糟。它只显示列标题和productinfo,只有一行,两个值都是1。没有别的了。也许你可以解释一下你的问题。我试图理解它,但失败了。也许在你解释之后我可以自己处理。但我已经感谢你的恩赐了@ccq21有关说明,请参阅我的编辑。。。我刚刚在Oracle DB上试用过,效果很好。。。将结果添加到我的答案中。。。如果在您的环境中失败,则数据与您在问题中显示的不一样…我的数据是正确的。一种产品可以同时匹配两个类别。这就是为什么主键都是属性。在另一个站点上,产品根本不需要与某个类别匹配。我现在明白你的疑问了。。。我想。。。但我不明白,为什么会有这样的错误。这是一个屏幕截图,展示了一个团队在这方面的成就@ccq21请仔细查看您提供的数据-您在类别1中有两次productID 4,这违反了主键!