【问题标题】:Where vs Having - Why do I get different results when setting date conditions? (Mysql)Where vs Have - 为什么我在设置日期条件时会得到不同的结果? (Mysql)
【发布时间】:2020-12-01 22:27:03
【问题描述】:

当我在代码的“WHERE”部分与“HAVING”部分设置日期条件时,我试图了解 MySql 如何以不同的方式处理日期条件。您能帮我理解以下情况下的逻辑有什么不同吗?为什么我使用 HAVING 应用日期条件时只得到一种产品,但使用 WHERE 时却得到两种产品?

问题:编写一个 SQL 查询,报告仅在 2019 年春季销售的产品。即 2019 年 1 月 1 日至 2019 年 3 月 31 日(含)。

+------------+--------------+------------+
| product_id | product_name | unit_price |
+------------+--------------+------------+
| 1          | S8           | 1000       |
| 2          | G4           | 800        |
| 3          | iPhone       | 1400       |
+------------+--------------+------------+

Sales table:
+-----------+------------+----------+------------+----------+-------+
| 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  |
+-----------+------------+----------+------------+----------+-------+
  1. 有选项(正确的选项)

    FROM Sales s 
    JOIN Product p 
    ON s.product_id = p.product_id
    GROUP by s.product_id
    HAVING min(sale_date)>='2019-01-01' AND max(sale_date)<='2019-03-31'
    
    
  2. 有结果 {"headers": ["product_id", "product_name"], "values": [[1, "S8"]]}

  3. 位置选项

    FROM Sales s 
    JOIN Product p 
    ON s.product_id = p.product_id
    WHERE sale_date BETWEEN '2019-01-01' AND '2019-03-31'
    GROUP by s.product_id
    
    
    
  4. 结果在哪里 {"headers": ["product_id", "product_name"], "values": [[1, "S8"], [2, "G4"]]}

那个 2, G4 是从哪里来的? (如果这是微不足道的,请提前道歉,我真的想自学,我没有人要问)

【问题讨论】:

  • WHERE 子句在聚合(GROUP BY)之前求值,HAVING 用于设置函数条件。
  • 即您的 WHERE 查询将返回至少在此期间售出的任何产品。而 HAVING 将返回仅在此期间售出的产品,

标签: mysql sql date where-clause having


【解决方案1】:

WHERE 正在过滤行以仅考虑 1 月、2 月和 3 月的销售额。因此,任何在该期间有销售的产品都包括在内。

另一方面,HAVING 正在考虑产品的所有销售。然后对于每个产品,它正在查看最小和最大日期。仅包括在 1 月、2 月和 3 月全部销售的产品。

考虑product_id = 2。它在 2 月份进行了促销,因此将包含在 WHERE 子句中。但是,它也在六月进行了销售。所以最大日期是六月——HAVING 子句将其过滤掉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2015-04-06
    • 2023-02-11
    • 1970-01-01
    相关资源
    最近更新 更多