首页 > 解决方案 > 查找没有活跃产品的用户

问题描述

我有以下数据库

id | userid | productid | specialid | buydate (timestamp in this sample as YYYY-MM-DD)
1 | 1 | 1 | 1 | 2020-12-01
2 | 2 | 1 | 3 | 2020-12-25
3 | 3 | 1 | 6 | 2020-12-20
4 | 4 | 1 | 2 | 2020-12-15
5 | 2 | 1 | 4 | 2021-01-15

我想知道谁有活跃的产品。我想获取在 2020-12-01 和 2020-12-18 之间购买该产品的特殊用户的所有用户 ID,而不是从最近购买相同产品的用户那里获取。

在本例中,这将是 ID 1,3,4。userid 2 在此期间购买了该产品,但在 1 月份再次购买了相同的产品。

目前我只能想出在 PHP 中创建两个数组的想法(一个是在 2020-12-01 和 2020-12-18 之间购买的),一个是在 2020-12-19 和 2021-01 之间购买的 - 25. 在另一个循环中,我可以检查新的匹配项中是否存在匹配项并将它们从第一个数组中删除。

但是没有“更简单”的方法吗?

标签: mysql

解决方案


鉴于此基本表结构:

CREATE TABLE data
(
    id INT NOT NULL AUTO_INCREMENT,
    userid INT NOT NULL,
    productid INT NOT NULL,
    specialid INT NOT NULL,
    buydate DATETIME NOT NULL,
    PRIMARY KEY (id)
);

INSERT INTO data  VALUES 
(1, 1, 1, 1, '2020-12-01'),
(2, 2, 1, 3, '2020-12-25'),
(3, 3, 1, 6, '2020-12-20'),
(4, 4, 1, 2, '2020-12-15'),
(5, 2, 1, 4, '2021-01-15'),
(7, 2, 1, 4, '2020-12-15');

您应该能够编写一个简单的查询来为您处理这个问题。主查询选择您的数据范围,子查询排除最近的数据。

SELECT
    *
FROM
    data
WHERE
    buydate BETWEEN '2020-12-01' AND '2020-12-18'
AND
    NOT userid IN
    (
    SELECT
        userid
    FROM
        data
    WHERE
        buydate > '2020-12-18'
    )
;

这应该会产生以下结果:

ID 用户身份 产品编号 特殊的 购买日期
1 1 1 1 2020-12-01 00:00:00
4 4 1 2 2020-12-15 00:00:00

推荐阅读