SQL选择:根据另一个字段选择正确的不同记录

时间:2010-12-11 21:59:58

标签: sql mysql

如何根据在另一个字段中选择具有最小值的记录来过滤记录列表以删除具有相同字段的记录?请注意,仅获得最小值是不够的......我需要从同一记录中获取其他字段。

我有一个“产品”表,我正在尝试添加应用优惠券代码的功能。由于发票的生成方式,以不同的成本销售产品被视为不同的产品。在数据库中,您可能会看到:

Product ID, Product Cost, Product Name, Coupon Code
    1,          20,          Product1,     null
    2,          10,          Product1,    COUPON1
    3,          40,          Product2,     null

我有一个查询,选择现在可用的所有产品的列表(基于其他标准;我正在简化这一点)。问题是,对于上述情况,我的查询返回:

  1 - Product1 for $20
  2 - Product1 for $10
  3 - Product2 for $40

这会向客户显示(假设他们已输入优惠券代码),向客户展示两种价格的相同产品显然是不好的形式。我想要的是:

  2 - Product1 for $10
  3 - Product2 for $40

即,显示每种产品的成本最低的版本。

我需要一个适用于MySQL的解决方案,但首选解决方案是标准SQL。

1 个答案:

答案 0 :(得分:3)

试试这个:

SELECT T2.* 
FROM
(
    SELECT `Product Name` AS name, MIN(`Product Cost`) AS cost
    FROM products
    GROUP BY `Product Name`
) T1
JOIN products T2
ON T1.name = T2.`Product Name`
AND T1.cost = T2.`Product Cost`

要完全按照您所描述的字符串获取输出,请将第一行替换为:

SELECT CONCAT(`Product ID`, ' - ', T1.name, ' for $', T1.cost)