Đây là một biến thể của greatest-n-per-group
vấn đề thường xuyên xảy ra.
Bạn muốn biểu mẫu hàng đơn FinishTierPrice (gọi nó là p1
), khớp với FinishOption và với Qty lớn nhất, nhưng vẫn nhỏ hơn hoặc bằng Qty của ProductOptionTier.
Một cách để làm điều này là cố gắng khớp với hàng thứ hai (p2
) từ FinishTierPrice sẽ có cùng một FinishOption và một Số lượng lớn hơn. Nếu không có hàng nào như vậy tồn tại (sử dụng một liên kết ngoài và kiểm tra xem đó là NULL), thì hàng được tìm thấy bởi p1
là vĩ đại nhất.
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