【问题标题】:difference between having column_A in & having column_A = in Mysql在 Mysql 中有 column_A 和 column_A = 之间的区别
【发布时间】:2021-04-28 18:24:16
【问题描述】:

问题来自leetcode sql question sales analysis I (https://leetcode.com/problems/sales-analysis-i/)。

问题询问畅销书,预期输出为:

|卖家 ID |

| 1 | | 3 |

表架构: 销售表:

seller_id product_id buyer_id sale_date quantity price
1 1 1 2019-01-21 2 2000
1 2 2 2019-02-17 1 800
2 2 3 2019-06-02 1 800
3 3 4 2019-05-13 2 2800

我用了两种方式:

方式一:

SELECT seller_id
FROM   sales
GROUP  BY seller_id
HAVING Sum(price) IN (SELECT Max(total_sales) AS top_sales
                      FROM   (SELECT seller_id,
                                     Sum(price) AS total_sales
                              FROM   sales
                              GROUP  BY seller_id)T) 

输出为 1,2,3

方式2:

SELECT seller_id
FROM   sales
GROUP  BY seller_id
HAVING Sum(price) = (SELECT Max(total_sales) AS top_sales
                      FROM   (SELECT seller_id,
                                     Sum(price) AS total_sales
                              FROM   sales
                              GROUP  BY seller_id)T) 

输出为 1,3

两个查询之间的唯一区别是第一个使用'IN',第二个使用'=',但输出不同。第一个有什么问题?

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    这些都是一样的。 IN 适用于子查询中有多行的情况。但是MAX()子查询只能返回一行,因为它是一个没有GROUP BY的聚合查询。

    这个结构可以不用嵌套子查询来编写:

    HAVING Sum(price) = (SELECT Sum(price) AS total_sales
                         FROM sales
                         GROUP BY seller_id
                         ORDER BY total_sales DESC
                         LIMIT 1
                        )
    

    然而,现在,最好学习如何使用窗口函数来做到这一点。

    【讨论】:

    • 同意,窗口功能在这里工作。我很困惑,因为我认为它们是相同的,但是 leetcode 的输出显示带有 in 的查询是错误的,因为它输出了所有结果。你知道为什么吗?
    • @ggggogloria 。 . .这两个查询是否得到不同的结果?它们应该返回相同的结果。
    • @ggggogloria 。 . .如果您在 IN 查询中有额外的 GROUP BY,就会发生这种情况。
    猜你喜欢
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多