MySQL顶级订购者(通过电子邮件分组),他们在上个月收到了订单

时间:2013-12-23 17:26:03

标签: php mysql

我正试图通过电子邮件获得顶级买家。我是这样做的:

SELECT email, MAX(dt) FROM orders GROUP BY email ORDER BY COUNT(*) DESC;

这是有效的,我通过电子邮件分组排名最高的行。所以通过电子邮件发送最高订单,按降序排序。

我现在坚持的部分是只看到不到一个月前的订单。

我尝试过以下内容,但收到错误:

SELECT email, MAX(dt) FROM orders WHERE TIMESTAMPDIFF(MONTH,MAX(dt),NOW()) < 1 GROUP BY email ORDER BY COUNT(*) DESC;

错误:

  

无效使用群组功能

我也尝试使用WHERE MAX(dt) between NOW() and NOW() - INTERVAL 1 MONTH,我也遇到了同样的错误。

有谁知道如何在MySQL中完成这项工作?

目标只是那些在过去一个月有订单的人的顶级订购者。

1 个答案:

答案 0 :(得分:2)

SELECT email, MAX(dt) last_order_time
FROM orders all_orders
JOIN (SELECT DISTINCT email
      FROM orders
      WHERE TIMESTAMPDIFF(MONTH, dt, NOW()) < 1) recent
USING (email)
GROUP BY email
ORDER BY COUNT(*) DESC

或:

SELECT email, MAX(dt) last_order_time
FROM orders
GROUP BY email
HAVING TIMESTAMPDIFF(MONTH, last_order_time, NOW()) < 1
ORDER BY COUNT(*) DESC

第二个版本更简单,但可能效率较低,因为它会在过滤掉没有最近订单的电子邮件之前计算所有电子邮件的计数和最大值。