sql >> Databasteknik >  >> RDS >> Mysql

MySQL LIMIT i en korrelerad delfråga

Detta är en variant av greatest-n-per-group problem som dyker upp ofta.

Du vill ha den enda radformen FinishTierPrice (kalla den p1 ), som matchar FinishOption och med det största antalet, men fortfarande mindre än eller lika med antalet för ProductOptionTier.

Ett sätt att göra detta är att försöka matcha en andra rad (p2 ) från FinishTierPrice som skulle ha samma FinishOption och ett större antal. Om det inte finns någon sådan rad (använd en yttre koppling och testa att den är NULL), då raden som hittas av p1 är störst.

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



  1. Hur LEAST() fungerar i MariaDB

  2. Hur man får mysql att acceptera externa anslutningar

  3. Använder SQL Server Integration Services (SSIS) för att fylla i QuickBooks-poster

  4. Är det bra att använda htmlspecialchars() innan du infogar i MySQL?