2010-08-19 3 views
1

У меня есть коррелированный подзапрос, который вернет список величин, но мне нужно наибольшее количество и только самое высокое. Поэтому я попытался ввести заказ и LIMIT из 1 для достижения этого, но MySQL выдает сообщение об ошибке, в котором он еще не поддерживает ограничения в подзапросах. Любые мысли о том, как обойти это?MySQL LIMIT в закодированном подзапросе

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 и с наибольшим Qty, но все же меньше или равно Qty ProductOptionTier.

Один из способов сделать это - попытаться сопоставить второй ряд (p2) с FinishTierPrice, который будет иметь тот же 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