Ini adalah variasi dari greatest-n-per-group
masalah yang sering muncul.
Anda menginginkan bentuk baris tunggal FinishTierPrice (sebut saja p1
), cocok dengan FinishOption dan dengan Qty terbesar, tetapi masih kurang dari atau sama dengan Qty ProductOptionTier.
Salah satu cara untuk melakukannya adalah dengan mencoba mencocokkan baris kedua (p2
) dari FinishTierPrice yang akan memiliki FinishOption yang sama dan Qty yang lebih besar. Jika tidak ada baris seperti itu (gunakan gabungan luar dan uji apakah itu NULL), maka baris tersebut ditemukan oleh p1
adalah yang terbesar.
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