sql >> Database >  >> RDS >> Mysql

MySQL LIMIT in een gecorreleerde subquery

Dit is een variatie op de greatest-n-per-group probleem dat vaak voorkomt.

U wilt de enkele rij van FinishTierPrice (noem het p1 ), overeenkomend met de FinishOption en met de grootste Qty, maar nog steeds kleiner dan of gelijk aan de Qty van de ProductOptionTier.

Een manier om dit te doen is om te proberen een tweede rij te matchen (p2 ) van FinishTierPrice die dezelfde FinishOption en een groter aantal zou hebben. Als zo'n rij niet bestaat (gebruik een outer join en test of deze NULL is), dan is de rij gevonden door p1 is de beste.

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. PostgreSQL-functie voor laatst ingevoegde ID

  2. ProxySQL uitvoeren als Kubernetes-service

  3. Top Open Source-tools voor MySQL- en MariaDB-migraties

  4. MySql C++ connector getString() werkt niet correct, terwijl getInt perfect werkt