我有一张包含所有购买商品的表格。
我需要检查哪些用户在特定时间段(例如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`
答案 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 |
答案 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
这会过滤掉从结束日期到现在没有购买任何东西的任何人。