1

SQL MIN() 関数を使用する場合、MIN 行に一致する追加フ​​ィールドを選択したいと考えています。次のクエリは正しい MIN(sellPrice) を返しますが、product_price テーブルの正しい行と一致しません。どうすればこれを達成できますか?

SELECT p.*, MIN(pp.sellPrice) AS sellPrice, pp.* FROM `product` AS p
LEFT JOIN `product_price_group` AS ppg ON p.`id` = ppg.`productId`
LEFT JOIN `product_price` AS pp ON ppg.`id` = pp.`priceGroupId`
WHERE p.`active` = 1 AND p.id = 1
4

3 に答える 3

1

あなたが探しているのは、低価格が存在しないすべての行です。

SELECT p.*, pp.sellPrice AS sellPrice, pp.* FROM `product` AS p
LEFT JOIN `product_price_group` AS ppg ON p.`id` = ppg.`productId`
LEFT JOIN `product_price` AS pp ON ppg.`id` = pp.`priceGroupId`
WHERE p.`active` = 1 AND p.id = 1
   AND NOT EXISTS (SELECT 1 FROM product_price AS pp2
       WHERE pp2.productId = pp.productId AND pp2.sellPrice < pp.sellPrice)
GROUP BY productId;

どのキーが関与しているかについて少し推測しています。アイデアはWHERE NOT EXISTS、低価格で関連する行を探すことです。このようにして、MySQL はそのような「低価格」の一致を見つけることができなかった行のみを結果に含めます。

于 2011-04-13T21:01:07.663 に答える
1

いくつかの提案により、私は GROUP BY 属性を使用しました。特定の製品の最も低い販売価格が必要な場合、次のクエリは正しく機能しています。

SELECT p.*, MIN(pp.sellPrice) AS sellPrice, pp.quantity, pp.`priceGroupId`
FROM `product` AS p
LEFT JOIN `product_price_group` AS ppg ON ppg.productId = p.`id`
LEFT JOIN `product_price` AS pp ON pp.priceGroupId = ppg.`id`
WHERE p.`active` = 1 AND  p.id = 1 AND pp.sellPrice IS NOT NULL
GROUP BY pp.id;

すべての製品:

SELECT p.*, MIN(pp.sellPrice) AS sellPrice, pp.quantity, pp.`priceGroupId`
FROM `product` AS p
LEFT JOIN `product_price_group` AS ppg ON ppg.productId = p.`id`
LEFT JOIN `product_price` AS pp ON pp.priceGroupId = ppg.`id`
WHERE p.`active` = 1 AND pp.sellPrice IS NOT NULL
GROUP BY pp.id;
于 2011-04-14T07:33:19.977 に答える
1

すべての製品またはすべての製品の最小販売価格が必要ですか?

すべての製品に

SELECT p.*
     , pp.sellPrice
     , pp.*
FROM product AS p
LEFT JOIN product_price_group AS ppg
  ON p.id = ppg.productId
LEFT JOIN product_price AS pp
  ON ppg.id = pp.priceGroupId
WHERE p.active = 1
  AND p.id = 1
  AND pp.sellPrice =
    ( SELECT MIN(pp.sellPrice)
      FROM product_price
    )

すべての製品に

SELECT p.*
     , pp.sellPrice
     , pp.*
FROM product AS p
LEFT JOIN product_price_group AS ppg
  ON p.id = ppg.productId
LEFT JOIN product_price AS pp
  ON ppg.id = pp.priceGroupId
JOIN
  ( SELECT priceGroupId
         , pp.MIN(pp.sellPrice) AS sellPrice
    FROM product_price
    GROUP BY priceGroupId
  ) AS ppmin
  ON  ppmin.priceGroupId = pp.priceGroupId
  AND ppmin.sellPrice = sellPrice
WHERE p.active = 1
  AND p.id = 1
于 2011-04-13T22:15:44.393 に答える