Where vs Having - 为什么我在设置日期条件时得到不同的结果? (Mysql)
Where vs Having - Why do I get different results when setting date conditions? (Mysql)
当我在代码的 'WHERE' 部分和 'HAVING' 部分设置日期条件时,我试图了解 MySql 如何以不同方式处理日期条件。您能帮我理解以下情况在逻辑上有什么区别吗?为什么我使用 HAVING 应用日期条件时只得到一个产品,但如果我使用 WHERE 却得到两个?
问题:编写一个 SQL 查询,报告仅在 spring 2019 年销售的产品。也就是说,在 2019-01-01 和 2019-03-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 |
+-----------+------------+----------+------------+----------+-------+
HAVING OPTION(正确的)
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"], "值": [[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"], "值": [[1, "S8"], [2, "G4 "]]}
那个2,G4是哪里来的?
(如果这是微不足道的,请提前道歉,我真的在努力自学,我没有人可以问)
WHERE
正在筛选行以仅考虑 1 月、2 月和 3 月的销售额。因此,任何在此期间有销售的产品都包括在内。
另一方面,HAVING
正在考虑产品的 all 销售额。然后对于每个产品,它正在查看最小和最大日期。仅包括在 1 月、2 月和 3 月有 全部 销售额的产品。
考虑product_id = 2
。它在 2 月份有促销活动,因此它会包含在 WHERE
子句中。但是,它在 6 月也有促销活动。所以最大日期是 Jun -- HAVING
子句将其过滤掉。
当我在代码的 'WHERE' 部分和 'HAVING' 部分设置日期条件时,我试图了解 MySql 如何以不同方式处理日期条件。您能帮我理解以下情况在逻辑上有什么区别吗?为什么我使用 HAVING 应用日期条件时只得到一个产品,但如果我使用 WHERE 却得到两个?
问题:编写一个 SQL 查询,报告仅在 spring 2019 年销售的产品。也就是说,在 2019-01-01 和 2019-03-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 |
+-----------+------------+----------+------------+----------+-------+
HAVING OPTION(正确的)
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"], "值": [[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"], "值": [[1, "S8"], [2, "G4 "]]}
那个2,G4是哪里来的? (如果这是微不足道的,请提前道歉,我真的在努力自学,我没有人可以问)
WHERE
正在筛选行以仅考虑 1 月、2 月和 3 月的销售额。因此,任何在此期间有销售的产品都包括在内。
另一方面,HAVING
正在考虑产品的 all 销售额。然后对于每个产品,它正在查看最小和最大日期。仅包括在 1 月、2 月和 3 月有 全部 销售额的产品。
考虑product_id = 2
。它在 2 月份有促销活动,因此它会包含在 WHERE
子句中。但是,它在 6 月也有促销活动。所以最大日期是 Jun -- HAVING
子句将其过滤掉。