【问题标题】:Mysql query with group by and having clause带有 group by 和有子句的 Mysql 查询
【发布时间】:2016-10-07 07:24:29
【问题描述】:

我正在构建查询以获得相同产品的最高价格。 我有桌子

-----------------------------------------
|   prod_id  |   price   |    user_id   |
-----------------------------------------
|     4      |   25      |       1      |
|     4      |   38      |       2      |
|     4      |   41      |       3      |
|     7      |   100     |       1      |
|     7      |   95      |       2      |
-----------------------------------------

我正在尝试获得以下输出:

-----------------------------------------
|     4      |   41      |       3      |
-----------------------------------------
|     7      |   100     |       1      |
-----------------------------------------

我构造了以下不正确的查询。

select * from user_bid group by prod_id having max(price);

谁能指导我获取所需结果的查询。

【问题讨论】:

  • 您使用的是 MySQL 还是 MS SQL Server?不要标记未涉及的产品,您已经得到了只适合其中一个的答案。
  • @jarih:一个项目中可以使用多个数据库引擎。 (虽然在这种情况下可能不是因为问题只提到了mysql)
  • @Kris,我知道,但很少见。因为超过 99% 的帖子有多个 dbms 标签,所以我经常问这个问题。

标签: mysql sql group-by having


【解决方案1】:
SELECT *
FROM user_bid 
WHERE (prodid, price) IN
(
    SELECT prodid, MAX(price)
    FROM user_bid 
    GROUP BY prod_id
)

【讨论】:

  • MySQL 是否支持行和表构造函数?
  • 有趣...我不知道这在 MySQL 中是可能的。
  • 与@TimBiegeleisen 的 JOIN 版本相比,这在性能方面如何?
  • @jarih 因为我的是一个更简单的查询,我想它会更好的性能明智
【解决方案2】:

这是一个使用连接的选项:

SELECT p1.*
FROM prod_id
INNER JOIN
(
    SELECT prod_id, MAX(price) AS price    -- this inner subquery finds the maximum
    FROM user_bid                          -- price for each product group
    GROUP BY prod_id
) p2
    ON p1.prod_id = p2.prod_id AND         -- and this join condition retains
       p1.price   = p2.price               -- only records which have this maximum
                                           -- price for each product group

这是一个使用子查询的选项:

SELECT p1.*
FROM prod_id p1
WHERE price = (SELECT MAX(p2.price) FROM prod_id p2 WHERE p1.prod_id = p2.prod_id)

【讨论】:

    【解决方案3】:

    对于 SQL Server

    ;WITH cte AS
    
    (
    SELECT prod_id,price,user_id,
           ROW_NUMBER() OVER(PARTITION BY prod_id ORDER BY price desc) as rank
    FROM table Name
    )
    
    SELECT prod_id,price,user_id
    FROM cte
    WHERE rank=1
    

    【讨论】:

    • 太糟糕了 OP 正在使用 MySQL...不太公平。
    • 他已经标记了 sql server .. 现在被删除了
    • 我知道,这就是我说这不公平的原因。
    • 实际上我有两个具有相同架构 mysql 和 sql server 的数据库。我相信相同的查询对两者都有效。这就是我放 2 个标签的原因
    【解决方案4】:

    使用以下查询:

    SELECT * FROM (SELECT * FROM user_bid  ORDER BY price DESC) AS Temp 
    GROUP BY prod_id 
    

    输出:

    【讨论】:

    • 我建议您按照指定创建表并插入数据,然后尝试查询。
    • 是的,我做了这个并且它工作正常。我将添加输出。
    • 其他数据库不知道,我用MySQL试过了。
    • 这甚至可能不会在所有版本的 MySQL 上运行相同,所以最好不要使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多