MySQL查找多个相同产品的最低价格行

标签 mysql aggregate

我有许多相同产品但条件不同且供应商/供应商不同的产品表,我想获得价格最低的产品和其他数据。

这里是一些条目

+----------+--------------------+-----------+------------+------------+--------------+-------------+
|    ID    |    Product Name    | new_price | old_price  |    price   |  provider_id |  condition  |
+----------+--------------------+-----------+------------+------------+--------------+-------------+
|    1     |   samsung tv 32    |   1200    |    null    |    null    |       2      |     new     |
|    2     |   samsung tv 32    |    null   |    null    |     800    |      123     | refurbished |
|    23    |   samsung tv 32    |    null   |     300    |    null    |       6      |     used    |
|    48    |   samsung tv 32    |   1500    |    null    |    null    |       8      |     new     |
|    2     |    smart watch     |    null   |    null    |     200    |      123     | refurbished |
|    23    |    smart watch     |    null   |     100    |    null    |       6      |     used    |
+----------+--------------------+-----------+------------+------------+--------------+-------------+

期望结果

+----------+--------------------+-----------+--------------+-------------+
|    ID    |    Product Name    |   price   |  provider_id |  condition  |
+----------+--------------------+-----------+--------------+-------------+
|    23    |   samsung tv 32    |    300    |       6      |     used    |
|    23    |    smart watch     |    100    |       6      |     used    |
+----------+--------------------+-----------+--------------+-------------+

这是我的查询,我累了。

SELECT
    MIN(
        IF(
            new_price > 0,
            new_price,
            IF(
                old_price > 0,
                old_price,
                IF(
                    price > 0,
                    price,
                    0
                )
            )
        )
    ) AS price,
    `name`,
    `id`,
    `provider_id`
FROM
    `products`
GROUP BY
    `name`

最佳答案

要获得所需的结果集,您可以使用带有 coalesce 的自连接来获取第一个非空值。

select p.ID,
p.name,
coalesce(p.`new_price`, p.`old_price`, p.`price`) as price,
p.provider_id,
p.condition
from products p
left join products p1 on p.name  = p1.name 
and coalesce(p.`new_price`, p.`old_price`, p.`price`) > coalesce(p1.`new_price`, p1.`old_price`, p1.`price`)  
where p1.ID is null

Demo

使用 join 获得相同结果的另一种方法

select p.ID,
p.name,
coalesce(p.`new_price`, p.`old_price`, p.`price`) as price,
p.provider_id,
p.condition
from products p
join (
  select name, min(coalesce(`new_price`, `old_price`,`price`)) as price
  from products
  group by name
) p1 on p.name  = p1.name 
and coalesce(p.`new_price`, p.`old_price`, p.`price`) = p1.price

Demo

关于MySQL查找多个相同产品的最低价格行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50326000/

相关文章:

r - 如何在 R 中迭代 data.frame

r - 如何根据自定义函数将 NA 去除合并到聚合中?

python - Pandas 中 groupby 和聚合的更快解决方案

mysql - mySQL 上的 SQL 连接查询帮助

php - Angularjs 不断给出 TypeError : Cannot read property 'dhx_security' of undefined

mysql - 无法使用 Adminer 和 docker-compose 连接到 MySQL 数据库

php - 使用 KCacheGrind 聚合 PHP XDebug 数据

python - 在对另一列进行分组后,查找列值的最大出现次数

php - mysql数据库不会在表上插入任何项目,浏览器也不会显示任何错误

mysql - 为 MySQL 和 SQL Server 编写 SQL 查询