我有一个电子商务MySQL数据库,可以在“订单”表中存储订单信息
我需要选择3月份的所有新客户。客户无需注册订购,因此我只使用客户电子邮件和订单的日期时间。因此,请选择前几个月根本没有功能的所有客户电子邮件。
数据库表有大约100k行,我正在寻找一个有效的查询。
我对SQL不太好(你可以告诉我!),但这就是我所拥有的......
SELECT distinct(user_email) FROM orders
WHERE order_datetime > '2011-03-01 00:00:00'
AND order_datetime < '2011-03-31 23:59:59'
AND user_email NOT IN (
SELECT user_email FROM orders
WHERE order_datetime < '2011-03-01 00:00:00')
GROUP BY user_email
这是一种非常复杂的做事方式吗? :)如果速度更快,请告诉我......
谢谢,Rich
答案 0 :(得分:3)
这个怎么样:
SELECT user_email
FROM orders
GROUP BY user_email
HAVING MIN(order_datetime) BETWEEN '2011-03-01' AND '2011-03-31 23:59:59';
HAVING
条款中检查了三月份的第一个订单。order_datetime
上设置索引会有所帮助。答案 1 :(得分:0)
这是一个非常合理的实施 - 尽管“分组依据”是多余的; DISTINCT不是聚合函数(http://www.w3schools.com/sql/sql_groupby.asp)。