Mysql 如果某个属性在特定日期之前未出现,如何计算按该属性分组的行数?

Mysql 如果某个属性在特定日期之前未出现,如何计算按该属性分组的行数?,mysql,sql,Mysql,Sql,按表格顺序 CREATE TABLE Orders ( order_id int(11), customer_id int(11), purchase_date datetime ) 我们需要以下报告:对于本月之前没有下订单的客户,每个客户下了多少订单 以下是我目前使用的非常慢的sql: SELECT count(order_id) num_of_orders, customer_id FROM (SELECT order_id, customer_id FROM o

按表格顺序

CREATE TABLE Orders (
order_id int(11),
customer_id int(11),
purchase_date datetime
)
我们需要以下报告:对于本月之前没有下订单的客户,每个客户下了多少订单

以下是我目前使用的非常慢的sql:

SELECT count(order_id) num_of_orders, customer_id 
FROM   (SELECT order_id, customer_id
        FROM   orders 
        WHERE  customer_id NOT IN (SELECT DISTINCT customer_id 
                                   FROM   orders 
                                   WHERE  purchase_date < '2019-03-01')) a 
GROUP  BY customer_id;

有没有更快/更有效的方法来编写此查询?

我将重新编写为:

SELECT COUNT(order_id), customer_id
FROM orders o
WHERE NOT EXISTS (SELECT 1 FROM orders o1 WHERE o1.customer_id = o.customer_id AND o1.purchase_date < '2019-03-01')
GROUP BY customer_id;
由于orderscustomer\u id上的索引,这将加快您的性能


但是,如果orders表包含customer_id的null,则NOT IN子查询将返回null

我不确定这会更快,但更简单:

SELECT customer_id, count(*) as num_of_orders
FROM  orders o
GROUP BY customer_id
HAVING MIN(purchase_date) >= '2019-03-01';

DISTINCT不是一个函数,它是SELECT DISTINCT的一部分,只需写入SELECT DISTINCT customer\u id即可处理整个选定行。。。使代码更清晰。然而,这里甚至不需要DISTINCT,所以一个简单的选择就可以了!谢谢,修正了@jarlh