【问题标题】:Selecting extra fields based on SQL MIN()基于 SQL MIN() 选择额外的字段
【发布时间】:2011-08-05 01:21:30
【问题描述】:

使用 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

【问题讨论】:

  • match the correct row in the product_price table. 是什么意思?你想加入最低价格还是什么?我实际上有点惊讶这个 SQL 甚至可以工作,因为你没有 GROUP BY 子句....
  • 是的,我确实在尝试加入最低价格,我想要属于最低售价的其他字段。

标签: mysql sql min


【解决方案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 将在您的结果中仅包含找不到此类“较低价格”匹配的行。

【讨论】:

    【解决方案2】:

    您想要所有产品还是每个产品的最低 sellPrice?

    适用于所有产品

    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
    

    【讨论】:

      【解决方案3】:

      根据一些建议,我使用了 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;
      

      【讨论】:

        猜你喜欢
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-05
        • 2021-11-23
        • 2021-08-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多