2014-03-12 88 views
0

我試圖以最低的價格獲得完整的行,而不僅僅是具有最低價格的字段。MySQL:以最小值獲取滿行

創建表:

CREATE TABLE `Products` (
    `SubProduct` varchar(100), 
    `Product` varchar(100), 
    `Feature1` varchar(100), 
    `Feature2` varchar(100), 
    `Feature3` varchar(100), 
    `Price1` float, 
    `Price2` float, 
    `Price3` float, 
    `Supplier` varchar(100) 
); 

插入:

INSERT INTO 
    `Products` (`SubProduct`, `Product`, `Feature1`, `Feature2`, `Feature3`, `Price1`, `Price2`, `Price3`, `Supplier`) 
VALUES 
    ('Awesome', 'Product', 'foo', 'foo', 'foor', '1.50', '1.50', '0', 'supplier1'), 
    ('Awesome', 'Product', 'bar', 'foo', 'bar', '1.25', '1.75', '0', 'supplier2'); 

選擇:

SELECT 
    `SubProduct`, 
    `Product`, 
    `Feature1`, 
    `Feature2`, 
    `Feature3`, 
    MIN(`Price1`), 
    `Price2`, 
    `Price3`, 
    `Supplier` 
FROM `Products` 
    GROUP BY `SubProduct`, `Product` 
    ORDER BY `SubProduct`, `Product`; 

你可以看到,在http://sqlfiddle.com/#!2/c0543/1/0

我得到弗里斯特插入的行與合作第二個插入行的列price1的內容。

我希望獲得具有正確功能,供應商和其他欄目的完整行。在本例中,它應該是完整的第二個插入行,因爲它在列price1中具有最低的價格。

+0

你'組by'使用是無效的SQL。但是,MySQL不是拒絕它,而是選擇簡單地返回「不確定」結果(這對於所有實際目的都是「隨機的」)。有關更多詳細信息,請參閱:http://www.mysqlperformanceblog.com/2006/09/06/wrong-group-by-makes-your-queries-fragile/ –

+0

如果有兩件產品的子產品和產品具有相同的最低價格? – StanislavL

+0

然後,哪個列被佔用並不重要。 – Hativ

回答

2

您需要得到最低報價行,然後與主表連接的行,像這樣:

SELECT 
    P.`SubProduct`, 
    P.`Product`, 
    P.`Feature1`, 
    P.`Feature2`, 
    P.`Feature3`, 
    `Price` AS Price1, 
    P.`Price2`, 
    P.`Price3`, 
    P.`Supplier` 
FROM `Products` AS P JOIN (
    SELECT `SubProduct`, `Product`, MIN(`Price1`) AS Price 
    FROM `Products` 
    GROUP BY `SubProduct`, `Product` 
) AS `MinPriceRows` 
ON P.`SubProduct` = MinPriceRows.`SubProduct` 
AND P.`Product` = MinPriceRows.`Product` 
AND P.Price1 = MinPriceRows.Price 
ORDER BY P.`SubProduct`, P.`Product`; 

工作演示:http://sqlfiddle.com/#!2/c0543/20

在這裏,我所做的是要得到作爲MinPriceRows表,它會給你最低每個子產品和產品的價格。然後,我將這些行與主表連接起來,以便主錶行可以簡化爲只包含每個SubProduct和Product包含最低價格的行。

+0

謝謝!如果SubProduct可能爲NULL會怎麼樣?用你的解決方案,這些行被忽略。請參閱http://sqlfiddle.com/#!2/de837/2/0 – Hativ

+0

@ Hativ3在這種情況下,應該輸出什麼?意思是你在輸出中期待什麼。 –

+0

SubProduct和Product可以看作是一個單元。如果SubProduct爲NULL,它只是一個沒有子產品的產品,您可以將其視爲一個新的(或另一個)獨立產品。那麼SubProduct可以只輸出NULL。你明白嗎? – Hativ

1

嘗試這樣的:

SELECT 
    `p`.`SubProduct`, 
    `p`.`Product`, 
    `p`.`Feature1`, 
    `p`.`Feature2`, 
    `p`.`Feature3`, 
`p`.`Price1`, 
    `p`.`Price2`, 
    `p`.`Price3`, 
    `p`.`Supplier` 
FROM `Products` `p` 
inner join (select MIN(`Price1`)as `Price1` 
      From `Products` 
      ) `a` on `a`.`Price1` = `p`.`Price1` 

ORDER BY `p`.`SubProduct`, `p`.`Product`; 

演示:http://sqlfiddle.com/#!2/c0543/24

0

這工作...

SELECT 
P1.`SubProduct`, 
P1.`Product`, 
P1.`Feature1`, 
P1.`Feature2`, 
P1.`Feature3`, 
P1.`Price1`, 
P1.`Price2`, 
P1.`Price3`, 
P1.`Supplier` 
FROM `Products` P1 
INNER JOIN `Products` P2 ON P1.SubProduct = P2.SubProduct AND P1.Product = P2.Product 
WHERE P1.Price1 < P2.Price1