MySQL - 选择在过去 y 天内至少下了 x 个订单并且在过去 z 天内没有订购的客户

标签 mysql sql

我正在尝试获取在过去 y 天内至少下了 x 订单并且在过去 z 内没有下订单的客户code> 天,所以我的客户可以知道哪些客户正在“离开”并且不会回来。

我的表很简单:

订单

- ID
- Created (UNIX timestamp)
- CustomerID

客户

- ID
- Name
- Phone

我在过去的 y 天内成功选择了 x 个订单,但我无法加入数据,所以我将只获得未订购的客户最近 z

这是我对在过去 30 天内下了 1 个以上订单的客户的查询:

SELECT
    COUNT(t1.CustomerID) as customer_count,
    t2.ID as customer_id,
    t2.Name,
    t2.Phone
FROM
    Orders t1
JOIN
    Customers t2
        ON t1.CustomerID = t2.ID
WHERE
    t1.Created BETWEEN (UNIX_TIMESTAMP() - (86400*30)) AND UNIX_TIMESTAMP()
GROUP BY
    t2.ID
HAVING customer_count >= 2

最佳答案

由于您在第一部分中取得了成功,而第二部分基本相同,您可以通过复制查询、稍作修改并将其作为子查询添加到 HAVING 来简化操作健康)状况。对过去 7 天内未下任何订单的客户试试这个:

SELECT
    COUNT(o1.CustomerID) as customer_count,
    c1.ID as customer_id,
    c1.Name,
    c1.Phone
FROM Customers c1
LEFT JOIN Orders o1 ON o1.CustomerID = c1.ID
WHERE o1.Created BETWEEN (UNIX_TIMESTAMP() - (86400*30)) AND UNIX_TIMESTAMP()
GROUP BY c1.ID
HAVING customer_count > 1
   AND (SELECT 
            COUNT(o2.CustomerID) as customer_count,
        FROM Customers c2
        LEFT JOIN Orders o2 ON o2.CustomerID = c2.ID
        WHERE o2.Created BETWEEN (UNIX_TIMESTAMP() - (86400*7)) AND UNIX_TIMESTAMP()
          AND c2.ID = c1.ID
        GROUP BY c2.ID) = 0

注意事项:

  • 我将您的条件从 customer_count >= 2 更改为 customer_count > 1 因为它读起来更好。
  • 我建议从主表 Customers 开始,然后加入 Orders,因为这样感觉更自然。
  • 我还建议使用比 t1t2 更有意义的别名。例如,co 读起来更好。通过上面的查询,您可以执行类似 c1c2o1o2 的操作。

编辑 由于子查询只计算一个给定客户的订单,我们不需要分组所以我们可以像这样简化它:

SELECT
    COUNT(o.CustomerID) as customer_count,
    c.ID as customer_id,
    c.Name,
    c.Phone
FROM Customers c
LEFT JOIN Orders o ON o.CustomerID = c.ID
WHERE o.Created BETWEEN (UNIX_TIMESTAMP() - (86400*30)) AND UNIX_TIMESTAMP()
GROUP BY c.ID
HAVING customer_count > 1
   AND (SELECT COUNT(*)
        FROM Orders o2
        WHERE o2.Created BETWEEN (UNIX_TIMESTAMP() - (86400*7)) AND UNIX_TIMESTAMP()
          AND o2.CustomerID = c.ID) = 0

关于MySQL - 选择在过去 y 天内至少下了 x 个订单并且在过去 z 天内没有订购的客户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47118458/

相关文章:

MySQL:如何找出哪些表引用了特定表?

mysql - 使用 MAX 函数时返回多条记录?

mysql - 根据值更新数据库

sql - 在 SQL 中,如何生成 5!56 的每个可能的唯一组合?

sql - 排行榜的高效 SQL 查询/架构

mysql - SQL用MYSQL连接来自多个表的数据

mysql - CUDA、MySQL 和 CMake

PHP 查询不从新 SQL 列返回数据 (MAMP)

mysql - 仅当所有指定条件都为 true 时才连接表的 SQL

java - 使用 MySQL 从 Java 中的多个表中选择带前缀的列