首页 > 解决方案 > 从链接表中获取 MIN、MAX 值

问题描述

我在 MYSQL DB 中有 3 个表

命令

   order_id | order_date
-------------------------
      1     | 2021-09-20    
      2     | 2021-09-21 

产品

   product_id | product_price
-------------------------
      1     | 30    
      2     | 34
      3     | 39
      4     | 25  

订购_产品

   product_id | order_id
-------------------------
      1     | 1    
      2     | 1 
      1     | 2    
      4     | 2 

现在,当我通过 order_id 给出特定产品 id 组时,我想知道特定订单中所有产品的最低和最高价格。

前任:

order_id | min_price         | max_price
-----------------------------------------
      1  | 30(p_id=1)        | 34(p_id=2)
      2  | 25(p_id=4)        | 30(p_id=1)

标签: mysqlsqlsqlalchemyflask-sqlalchemy

解决方案


您可以使用以下内容:

    SELECT
        op.order_id,
        MIN(p.product_price) as min_price,
        MAX(p.product_price) as max_price
    FROM
        ORDER_PRODUCTS op
    INNER JOIN
        PRODUCTS p ON op.product_id = p.product_id
    GROUP BY 
        op.order_id

编辑 1

因为它涉及

现在我想知道特定订单中所有产品的最低和最高价格

您可以使用 where 子句仅考虑特定顺序

    SELECT
        op.order_id,
        MIN(p.product_price) as min_price,
        MAX(p.product_price) as max_price
    FROM
        ORDER_PRODUCTS op
    WHERE
        op.order_id = <insert order id here>
    INNER JOIN
        PRODUCTS p ON op.product_id = p.product_id
    GROUP BY 
        op.order_id

或者,如果您想确定具有特定产品的订单的最低和最高价格,您可以如下修改您的 where 子句以使用带有子查询的 IN

    SELECT
        op.order_id,
        MIN(p.product_price) as min_price,
        MAX(p.product_price) as max_price
    FROM
        ORDER_PRODUCTS op
    WHERE
        op.order_id IN (
             SELECT inc.order_id
             FROM ORDER_PRODUCTS inc
             WHERE inc.product_id = <insert product id here>
        )
    INNER JOIN
        PRODUCTS p ON op.product_id = p.product_id
    GROUP BY 
        op.order_id

或者简单地通过使用带有 case 语句的 having 子句来过滤

    SELECT
        op.order_id,
        MIN(p.product_price) as min_price,
        MAX(p.product_price) as max_price
    FROM
        ORDER_PRODUCTS op
    INNER JOIN
        PRODUCTS p ON op.product_id = p.product_id
    GROUP BY 
        op.order_id
    HAVING 
        SUM(
            CASE WHEN op.product_id = <insert product id here> THEN 1 END
        ) > 0

注意。测试时请用实际值替换<insert product id here>和。<insert order id here>

查看工作演示 db fiddle

让我知道这是否适合您。


推荐阅读