Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL LIMIT in einer korrelierten Unterabfrage

Dies ist eine Variation von greatest-n-per-group Problem, das häufig auftritt.

Sie möchten das einzeilige Formular FinishTierPrice (nennen Sie es p1 ), passend zur FinishOption und mit der größten Menge, aber immer noch kleiner oder gleich der Menge der ProductOptionTier.

Eine Möglichkeit, dies zu tun, besteht darin, zu versuchen, eine zweite Zeile abzugleichen (p2 ) von FinishTierPrice, die die gleiche FinishOption und eine größere Menge hätten. Wenn keine solche Zeile vorhanden ist (verwenden Sie einen äußeren Join und testen Sie, ob er NULL ist), dann die von p1 gefundene Zeile ist das Größte.

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