我想查找当年未购买商品的客户列表。
我被困在“当年”部分。
SELECT c.fname, c.lname
FROM customers c
WHERE c.cust_id NOT IN (SELECT s.Cust_id FROM sales s);
谢谢。
答案 0 :(得分:1)
要过滤日期,一种有效的方法是将其与代表当前年份开始的固定值进行比较,例如DATE_FORMAT(NOW() ,'%Y-01-01')
。
此外,我将使用带有关联子查询的IN
条件,而不是使用NOT EXISTS
运算符(虽然两者都应工作,但这是NOT EXISTS
的典型用例,因为您实际上不需要访问子查询中的任何内容):
SELECT c.fname, c.lname
FROM customers c
WHERE NOT EXISTS (
SELECT 1
FROM sales s
WHERE s.cust_id = c.cust_id AND s.date >= DATE_FORMAT(NOW() ,'%Y-01-01')
)
这里是另一个使用`LEFTJOINè的选项:
SELECT c.fname, c.lname
FROM customers c
LEFT JOIN sales s
ON s.cust_id = c.cust_id
AND s.date >= DATE_FORMAT(NOW() ,'%Y-01-01')
WHERE s.cust_id IS NULL
答案 1 :(得分:0)
SELECT c.fname, c.lname
FROM customers c
LEFT JOIN sales s ON c.cust_id = s.cust_id
AND YEAR(s.Date) = YEAR(CURDATE())
WHERE s.Sales_id IS NOT NULL
此查询返回客户并退出销售,从而使它对于整个查询是可选的。它的加入是针对客户的,并且发生在今年。然后在where子句中,如果没有返回销售行,即Sales_id为null,则仅返回一行。