如何获取仅在特定时间段内购买商品的用户(MySQL数据库)

时间:2013-07-18 14:59:45

标签: mysql sql

我有一张包含所有购买商品的表格。

我需要检查哪些用户在特定时间段(例如2013-03-21至2013-04-21之间)购买了商品,之后从未购买任何商品。

我可以选择在这段时间内购买商品的用户,但我不知道如何过滤那些从未购买任何商品的用户...

SELECT `userId`, `email` FROM my_table 
WHERE `date` BETWEEN '2013-03-21' AND '2013-04-21' GROUP BY `userId`

6 个答案:

答案 0 :(得分:3)

试一试

SELECT 
  user_id
FROM 
  my_table 
WHERE 
  purchase_date >= '2012-05-01'        --your_start_date
GROUP BY 
  user_id
HAVING 
  max(purchase_date) <= '2012-06-01';  --your_end_date

通过获取所有记录>= start date,按user_id对结果集进行分组,然后为每个用户查找max购买日期。 max购买日期应为<=end date。由于此查询不使用join/inner query,因此可能更快

测试数据

CREATE table user_purchases(user_id int, purchase_date date);
insert into user_purchases values (1, '2012-05-01');
insert into user_purchases values (2, '2012-05-06');
insert into user_purchases values (3, '2012-05-20');
insert into user_purchases values (4, '2012-06-01');
insert into user_purchases values (4, '2012-09-06');
insert into user_purchases values (1, '2012-09-06');

<强>输出

| USER_ID |
-----------
|       2 |
|       3 |

SQLFIDDLE

答案 1 :(得分:2)

这可能是实现这一目标的标准方法:

SELECT `userId`, `email` FROM my_table mt
WHERE `date` BETWEEN '2013-03-21' AND '2013-04-21' 
AND NOT EXISTS (
    SELECT * FROM my_table mt2 WHERE 
        mt2.`userId` = mt.`userId` 
        and mt2.`date` > '2013-04-21' 
)
GROUP BY `userId`

答案 2 :(得分:1)

您必须分两个阶段进行 - 一个查询以获取在该时间段内购买的用户列表,然后另一个查询以获取该用户列表并查看他们之后是否购买了任何内容,例如

SELECT userID, email, count(after.*) AS purchases
FROM my_table AS after
LEFT JOIN (
    SELECT DISTINCT userID
    FROM my_table
    WHERE `date` BETWEEN '2013-03-21' AND '2013-04-21'
) AS during ON after.userID = during.userID
WHERE after.date > '2013-04-21'
HAVING purchases = 0;

内部查询获取在此期间至少购买了一件东西的用户ID列表。然后该列表会在同一个表格中加入,但会在此期间过滤以进行购买,并计算他们进行的购买次数,并过滤到只有购买后“0”的用户。

可能不会像书面说的那样 - 还没有我的早茶。

答案 3 :(得分:1)

尝试以下

 SELECT `userId`, `email` 
 FROM my_table WHERE `date` BETWEEN '2013-03-21' AND '2013-04-21' 
 and user_id not in 
    (select user_id from my_table 
     where `date` < '2013-03-21' or `date` > '2013-04-21' ) 
 GROUP BY `userId`

答案 4 :(得分:1)


 SELECT `userId`, `email` FROM my_table WHERE (`date` BETWEEN '2013-03-21' AND '2013-04-21') and `date` >= '2013-04-21'  GROUP BY `userId`

这将仅选择在该时间范围之后购买的 AND 期间购买的用户。

希望这会有所帮助。

答案 5 :(得分:1)

SELECT 
    a.userId,
    a.email 
FROM
    my_table AS a 
WHERE a.date BETWEEN '2013-03-21' 
    AND '2013-04-21' 
    AND a.userId NOT IN 
    (SELECT 
        b.userId
    FROM
        my_table AS b 
    WHERE b.date BETWEEN '2013-04-22' 
        AND CURDATE() 
    GROUP BY b.userId) 
GROUP BY a.userId

这会过滤掉从结束日期到现在没有购买任何东西的任何人。