【发布时间】: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 |
+-----------+------------+----------+------------+----------+-------+
-
有选项(正确的选项)
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' -
有结果 {"headers": ["product_id", "product_name"], "values": [[1, "S8"]]}
-
位置选项
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 -
结果在哪里 {"headers": ["product_id", "product_name"], "values": [[1, "S8"], [2, "G4"]]}
那个 2, G4 是从哪里来的? (如果这是微不足道的,请提前道歉,我真的想自学,我没有人要问)
【问题讨论】:
-
WHERE 子句在聚合(GROUP BY)之前求值,HAVING 用于设置函数条件。
-
即您的 WHERE 查询将返回至少在此期间售出的任何产品。而 HAVING 将返回仅在此期间售出的产品,
标签: mysql sql date where-clause having