Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL LIMIT in una sottoquery correlata

Questa è una variazione del greatest-n-per-group problema che si presenta frequentemente.

Vuoi il modulo a riga singola FinishTierPrice (chiamalo p1 ), corrispondente a FinishOption e con la Qtà maggiore, ma comunque inferiore o uguale alla Qtà del ProductOptionTier.

Un modo per farlo è provare ad abbinare una seconda riga (p2 ) da FinishTierPrice che avrebbe la stessa FinishOption e una Qty maggiore. Se non esiste una tale riga (usa un outer join e verifica che sia NULL), allora la riga trovata da p1 è il più grande.

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