我正在尝试获取在过去 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
,因为这样感觉更自然。 - 我还建议使用比
t1
和t2
更有意义的别名。例如,c
和o
读起来更好。通过上面的查询,您可以执行类似c1
、c2
、o1
和o2
的操作。
编辑 由于子查询只计算一个给定客户的订单,我们不需要分组所以我们可以像这样简化它:
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/