2011-11-27 54 views
1

由於這是我遇到過這種問題時發現的最好的網頁,我想在這裏提出這個問題。我在這裏有點困惑。我是SQL語句的初學者,所以我需要你的幫助。我有三個表:按類別獲取產品的全部信息 - SQL?

  • 產品
  • PRODUCT_CATEGORY
  • product_to_category

我告訴你導出的SQL文件,所以你可能會得到這樣的:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 
SET time_zone = "+00:00"; 

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@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 [email protected]_CHARACTER_SET_CLIENT */; 
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; 
/*!40101 SET [email protected]_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) 

希望這是足以表明亞...

+1

使其更清晰請出示一些示例數據並想要結果... – Yahia

+0

我希望你能處理我最後的編輯。 – Basti909851

+0

您顯示的結果與您提供的樣本數據不匹配 - 例如:14.50從哪裏來?數據只包含14.95? – Yahia

回答

1

我認爲你很接近,但我會'開始'無論是產品或類別。
我會先從產品開始,鏈接到product_category,然後再到例如catergory等。例如:

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 

從此開始,檢查結果,然後根據需要添加分組。

+0

我開始這樣,但是這給了我相同的結果...我得到了正確數量的產品類別,但只有一個procut ... – Basti909851

+0

你嘗試分組?說pc.category_id? –

+0

現在我看到你的輸出,我可以看到你可能想要有一個內部選擇,例如'選擇col1,col2,col3',(從tbl中選擇字段,加入到一個現有的表別名),''detail''行的'col4,col5'樣式。 –

1

使用(修正版)

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本身來處理,你將不得不處理它在你的代碼...

編輯 - 按評論:

以上選擇提出了兩個選間內加入...冷杉st每個類別獲得一行加上該類別的產品數......第二個獲得所有產品的每個類別...這些通過類別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) 

BTW:您的樣本數據,似乎離......你有兩次 1,而productID 5是不是在任何地方使用...

+0

哇,這看起來很可怕...我在我的phpMyAdmin平臺上測試了這個。這隻顯示了一行。 productCount是5,categoryName = Schwimmbecken,productTitle = Chlor 5L和productPrice = 14.95 - 但我希望這些信息適用於此類別的所有產品... – Basti909851

+0

嗯,這是更糟的。它只顯示colums標題和productinfo,只有一行,兩個值都是1.沒有別的。也許你解釋一下你的查詢。我試圖理解它,但我失敗了。你的解釋後,梅比可以自己處理它。但我已經非常感謝你爲你服務! – Basti909851

+0

@ ccq21對於解釋請參閱我的編輯...我只是在這裏嘗試它(在Oracle數據庫上),並且工作得很好...將結果添加到我的答案中...如果在您的環境中失敗,那麼數據不是你在你的問題中顯示... – Yahia

相關問題