Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL LIMIT dans une sous-requête corrélée

Il s'agit d'une variante du greatest-n-per-group problème qui revient fréquemment.

Vous voulez le formulaire de ligne unique FinishTierPrice (appelez-le p1 ), correspondant à FinishOption et avec la plus grande quantité, mais toujours inférieure ou égale à la quantité de ProductOptionTier.

Une façon de faire est d'essayer de faire correspondre une deuxième ligne (p2 ) de FinishTierPrice qui aurait la même FinishOption et une quantité supérieure. Si aucune ligne de ce type n'existe (utilisez une jointure externe et testez qu'elle est NULL), alors la ligne trouvée par p1 est le plus grand.

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