【问题标题】:Get MIN, MAX values from a linking table从链接表中获取 MIN、MAX 值
【发布时间】:2021-11-15 13:58:06
【问题描述】:

我在一个 MYSQL 数据库中有 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  

ORDER_PRODUCTS

   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)

【问题讨论】:

    标签: mysql sql sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您可以使用以下内容:

        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语句的have子句来过滤

        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
    

    注意。测试时请将&lt;insert product id here&gt;&lt;insert order id here&gt;替换为实际值。

    View working demo db fiddle

    让我知道这是否适合你。

    【讨论】:

    • 感谢@ggordon 的回复,但这里我只需要包含特定产品的订单(将其作为product_id=1)。
    • 使用 WHERE 子句
    • @RahulBiswas 当我添加 where 子句时,它给了我整个产品表的最小值和最大值,但我只需要订单中产品的最小值和最大值。我会更新问题,然后你就会清楚地理解。
    • 好的 @AchyuthKodali 请更新问题。
    • 请检查所需的输出表和产品表。 @RahulBiswas
    猜你喜欢
    • 2017-06-10
    • 2017-08-07
    • 2021-10-14
    • 2014-09-06
    • 1970-01-01
    • 2017-09-01
    • 2019-10-09
    • 2019-11-11
    • 1970-01-01
    相关资源
    最近更新 更多