我试图仅选择在特定时间段内每年至少订购一次的客户ID,例如2010年至2017年
例子:
1. 2010年,2011年,2012年,2013年,2014年,2015年,2016年,2017年订购的客户应显示为
2.客户在2010年,2011年,2012,2013,2014,2015,2017年订购时不应显示
我的查询在所有年份内都不计入
o_id o_c_id o_type o_date
1345 13 TA 2015-01-01
7499 13 TA 2015-01-16
7521 14 GA 2015-01-08
7566 14 TA 2016-01-24
7654 16 FB 2016-01-28
c_id c_name c_email
13 Anderson example@gmail.com
14 Pegasus example@gmail.com
15 Miguel example@gmail.com
16 Megan example@gmail.com
我的疑问:
select c.id, c.name, count(*) as counts, year(o.date)
from orders o
join customer c on o.c_id=c.id
where year(o.date) > 2009
group oy c.id
having count(*) > 7
答案 0 :(得分:0)
您需要一张包含所有年份的表格,以便您可以检查该年度的用户订单。我创建了一个只有两年的样本,因为这是样本数据中的内容。
您可以使用它来创建年份列表:
How to get list of dates between two dates in mysql select query
此外,我使用范围多年,因此您可以在加入时使用索引。
如果您已有表users
,则可以替换子查询
SELECT user_id, COUNT(o_id) as total_years
FROM years y
CROSS JOIN (SELECT DISTINCT `o_c_id` as `user_id` FROM `orders`) as users
LEFT JOIN orders o
ON o.`o_date` >= y.`year_begin`
AND o.`o_date` < y.`year_end`
AND o.`o_c_id` = `user_id`
GROUP BY user_id
HAVING total_years = (SELECT COUNT(*) FROM years)
;