获取所有不同的用户 - MySql

时间:2016-06-21 07:08:22

标签: php mysql

我有一个包含以下类型和信息的表。

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。

现在,我想全部活跃的 user_id / 在过去的所有3个周期内都有产品( 2016-04-01,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')。

2 个答案:

答案 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

SqlFiddle