【问题标题】:Join table with MAX value from another从另一个连接具有 MAX 值的表
【发布时间】:2023-03-27 02:05:01
【问题描述】:
select * from order
-------------------
|orderID|productID|
-------------------
|  1    |  234    |
|  2    |  234    |
|  3    |  123    |
-------------------

select * from product_supplier
-------------------------------------------
|ID|supplierID|productID|cost_price|latest|
-------------------------------------------
|1 |  1       | 234     | 1.00     | 0    |
|2 |  1       | 234     | 0.50     | 1    |
|3 |  2       | 123     | 0.75     | 1    |
-------------------------------------------


desired result
------------------------------
|orderID|productID|cost_price|
------------------------------
| 1     | 234     | 1.00     |
| 2     | 234     | 1.00     |
| 3     | 123     | 0.75     |
------------------------------

我希望加入上面的两个表,以获得给定 productIDorderIDproductID 和最大的 cost_price

SELECT orderID, productID, cost_price 
FROM order LEFT JOIN product_supplier 
ON order.productID=product_supplier.productID AND MAX(cost_price);

ERROR 1111 (HY000): Invalid use of group function

如何将joined 表限制为每个order 一行,并与product_supplier 中对应的最大cost_price 值相连接?

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    解决此问题的规范方法是使用子查询从 product_supplier 表中识别产品及其最高价格,然后将此子查询连接到 order 以获得所需的结果集。

    SELECT t1.orderID,
           t1.productID,
           COALESCE(t2.cost_price, 0.0) AS cost_price  -- missing products will appear
    FROM order t1                                      -- with a zero price
    LEFT JOIN
    (
        SELECT productID, MAX(cost_price) AS cost_price
        FROM product_supplier
        GROUP BY productID
    ) t2
        ON t1.productID  = t2.productID AND
           t1.cost_price = t2.cost_price
    

    【讨论】:

    • 我已经使用了子查询方法,还有其他一些事情正在发生,尤其是取 cost_prices 的总和并按问题中未显示的日期分组,但这已经解决了我的问题。非常感谢!
    【解决方案2】:

    当你需要使用 aggregate 时,你必须使用 group by 并且在比较条件下使用 Having

     SELECT orderID, productID, MAX(cost_price)
     FROM order LEFT JOIN product_supplier 
     ON order.productID=product_supplier.productID having cost_price=MAX(cost_price) group by productID ;
    

    【讨论】:

    • 此查询有问题,因为您选择了orderID,但它没有出现在GROUP BY 子句中(也没有包含在聚合函数中)。
    • 如果关闭 MySQL 的严格模式,您的查询可能会运行,但最好不要依赖于此。
    猜你喜欢
    • 2021-08-08
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多