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