2010-08-19 2 views
1

수량 목록을 반환하는 상관 관계 부속 질의가 있지만 최대 수량 만 필요합니다. 그래서 이것을 달성하기 위해 1과 1의 LIMIT를 도입하려고 시도했지만, MySQL은 아직 서브 쿼리에서 한계를 지원하지 않는다는 오류를 던집니다. 이 문제를 해결하는 방법에 대한 의견이 있으십니까?Correllated Subquery의 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의 변형입니다.

FinishOption 및 최대 Qty와 일치하지만 ProductOptionTier의 Qty보다 작거나 같은 단일 행 양식 FinishTierPrice (p1)를 원합니다.

이 작업을 수행하는 한 가지 방법은 FinishOption과 Qty가 동일한 두 번째 행 (p2)을 FinishTierPrice에서 일치시키려는 것입니다. 그런 행이 없으면 (외부 조인을 사용하고 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