2010-08-19 55 views
1

我有一个相关的子查询,它将返回一个数量列表,但我需要最高数量,并且只有最高数量。所以我试图通过1的LIMIT来引入一个命令来实现这一点,但是MySQL会抛出一个错误,指出它还不支持子查询中的限制。有关如何解决此问题的任何想法?在相关子查询中的MySQL限制

SELECT Product.Name, ProductOption.Name, a.Qty, a.Price, SheetSize.UpgradeCost, 
     FinishType.Name, FinishOption.Name, FinishTierPrice.Qty, FinishTierPrice.Price 
FROM `Product` 
    JOIN `ProductOption` 
     ON Product.idProduct = ProductOption.Product_idProduct 
    JOIN `ProductOptionTier` AS a 
     ON a.ProductOption_idProductOption = ProductOption.idProductOption 
    JOIN `PaperSize` 
     ON PaperSize.idPaperSize = ProductOption.PaperSize_idPaperSize 
    JOIN `SheetSize` 
     ON SheetSize.PaperSize_idPaperSize = PaperSize.idPaperSize 
    JOIN `FinishOption` 
     ON FinishOption.Product_idProduct = Product.idProduct 
    JOIN `FinishType` 
     ON FinishType.idFinishType = FinishOption.Finishtype_idFinishType 
    JOIN `FinishTierPrice` 
     ON FinishTierPrice.FinishOption_idFinishOption = FinishOption.idFinishOption 
WHERE Product.idProduct = 1 
    AND FinishTierPrice.idFinishTierPrice IN (SELECT FinishTierPrice.idFinishTierPrice 
               FROM `FinishTierPrice` 
               WHERE FinishTierPrice.Qty <= a.Qty 
               ORDER BY a.Qty DESC 
               LIMIT 1) 

回答

3

这是经常出现的greatest-n-per-group问题的变体。

您需要单行表单FinishTierPrice(称为p1),匹配FinishOption和最大的数量,但仍小于或等于ProductOptionTier的数量。

一种方法是尝试匹配FinishTierPrice中的第二行(p2),该行具有相同的FinishOption和更大的数量。如果不存在这样的行(使用外连接并测试它为NULL),则p1找到的行最大。

SELECT Product.Name, ProductOption.Name, a.Qty, a.Price, SheetSize.UpgradeCost, 
     FinishType.Name, FinishOption.Name, FinishTierPrice.Qty, FinishTierPrice.Price 
FROM `Product` 
    JOIN `ProductOption` 
     ON Product.idProduct = ProductOption.Product_idProduct 
    JOIN `ProductOptionTier` AS a 
     ON a.ProductOption_idProductOption = ProductOption.idProductOption 
    JOIN `PaperSize` 
     ON PaperSize.idPaperSize = ProductOption.PaperSize_idPaperSize 
    JOIN `SheetSize` 
     ON SheetSize.PaperSize_idPaperSize = PaperSize.idPaperSize 
    JOIN `FinishOption` 
     ON FinishOption.Product_idProduct = Product.idProduct 
    JOIN `FinishType` 
     ON FinishType.idFinishType = FinishOption.Finishtype_idFinishType 
    JOIN `FinishTierPrice` AS p1 
     ON p1.FinishOption_idFinishOption = FinishOption.idFinishOption 
     AND p1.Qty <= a.Qty 
    LEFT OUTER JOIN `FinishTierPrice` AS p2 
     ON p2.FinishOption_idFinishOption = FinishOption.idFinishOption 
     AND p2.Qty <= a.Qty AND (p2.Qty > p1.Qty OR p2.Qty = p1.Qty 
      AND p2.idFinishTierPrice > p1.idFinishTierPrice) 
WHERE Product.idProduct = 1 
    AND p2.idFinishTierPrice IS NULL