我有一个包含以下类型和信息的表。
product_id | user_id | product | date_opened
1 | 10 | shoes | 2016-04-01
2 | 26 | shoes | 2016-04-01
3 | 10 | watch | 2016-04-01
4 | 23 | shoes | 2016-04-01
5 | 10 | shoes | 2016-01-01
6 | 13 | watch | 2016-01-01
7 | 14 | shoes | 2015-11-02
8 | 10 | slippers| 2015-11-02
9 | 10 | shoes | 2015-11-02
10 | 15 | watch | 2015-11-02
11 | 19 | watch | 2015-09-03
12 | 19 | watch | 2015-03-02
13 | 19 | shoes | 2015-01-03
如果产品开放,用户可以购买。 date_open
是日期周期。用户可以购买任意数量的产品,例如user_id
10 ,用户 10 在2016-04-01周期有2个产品。一个产品在2016-01-01,两个在2015-11-02。
现在,我想全部活跃的
请注意,用户可以在一个周期中拥有许多产品。
其他:
有效 - 应连续拥有3套dates
中的产品且不跳过。
因此,它应该在2016-04-01和2016-01-01和2015-11-02日期向所有用户显示产品。不是仅在1或2个日期使用产品的用户。
此处的另一个问题:示例,我有不同日期的用户(2000-04-05,2001-09-03,2006-09-01,2015-11-02等。 。)我想在这里得到所有那些有日期的用户('2016-04-01','2016-01-01','2015-11-02')。
答案 0 :(得分:3)
此SQL为您提供在前三个周期日期内拥有产品的不同用户:
SELECT USER_ID
FROM YOUR_TABLE OUTER_TABLE
WHERE 3 = (SELECT COUNT(DISTINCT DATE_OPENED)
FROM YOUR_TABLE INNER_TABLE
WHERE DATE_OPENED IN ('2016-04-01', '2016-01-01', '2015-11-02')
AND OUTER_TABLE.USER_ID = INNER_TABLE.USER_ID);
如果重写如下,则该语句可能更快(未经测试):
SELECT DISTINCT USER_ID
FROM YOUR_TABLE OUTER_TABLE
WHERE EXISTS (SELECT 1
FROM YOUR_TABLE INNER_TABLE
WHERE OUTER_TABLE.USER_ID = INNER_TABLE.USER_ID
WHERE DATE_OPENED = '2016-04-01')
AND EXISTS (SELECT 1
FROM YOUR_TABLE INNER_TABLE
WHERE OUTER_TABLE.USER_ID = INNER_TABLE.USER_ID
WHERE DATE_OPENED = '2016-01-01')
AND EXISTS (SELECT 1
FROM YOUR_TABLE INNER_TABLE
WHERE OUTER_TABLE.USER_ID = INNER_TABLE.USER_ID
WHERE DATE_OPENED = '2015-11-02');
答案 1 :(得分:1)
select distinct (user_id) from prod inner join
(select distinct(date_opened) from prod order by date_opened desc limit 3) t
on prod.date_opened = t.date_opened
内部选择获得最后3个周期。外部选择查找该周期的所有记录,并从中获取不同的user_id-s