Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取所有不同的用户-MySql_Php_Mysql - Fatal编程技术网

Php 获取所有不同的用户-MySql

Php 获取所有不同的用户-MySql,php,mysql,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

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

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
如果产品是开放的,用户可以购买<代码>日期\u打开是日期周期。用户可以购买任意数量的产品,例如
user\u id
10,用户10在2016-04-01周期中有2种产品。2016-01-01一款产品,2015-11-02两款产品

现在,我想获取所有活跃的(不同的)用户id/在所有前3个周期日期都有产品(2016-04-01、2016-01-01和2015-11-02)

请注意,一个用户可以在一个周期内拥有许多产品

其他: 活动的-应连续有3套
日期的产品
,且不得跳过。 因此,它应显示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”)

此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');
内部选择获取最后3个周期。外部选择查找该周期的所有记录,并从中获取不同的用户id


据我所知,您的日期不是动态的,它们不需要是动态的。要求获取活动用户列表,即在前三个周期日期拥有产品的用户。当然,如果要求获得过去至少有三个不同周期日期的产品的用户列表,那么SQL是不同的。当日期勾选到2017年时会发生什么?如何评估最后三个周期日期不是问题的核心。在我的回答中,我假设最后三个周期的日期是问题中列出的日期。@c.k您不需要年份在这里是动态的吗?这个查询与2017年无关。我喜欢这里的想法。问题是,如果我的一些用户的日期没有列在我的问题
('2016-04-01','2016-01-01','2015-11-02')
。例如,我有不同日期的用户
(2000-04-05、2001-09-03、2006-09-01、2015-11-02等等)
,因此将使用您的查询将其包括在内。我只想得到那些日期
('2016-04-01','2016-01-01','2015-11-02')
的用户。希望收到你的来信。谢谢将包括在较旧周期和最近3个周期中有日期的用户,仅在较旧周期中有日期的用户将不包括在内。如果你想得到的用户只有最后3个周期的日期,而没有其他周期的日期,请提及这一点,我会稍微更正我的查询。我刚刚更新了我的帖子。并在表格上添加一些样本。在阅读和
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