在MySQL中更有效地使用MAX()

时间:2014-04-23 22:47:06

标签: mysql

我正在尝试获取订购了类别ID为10但本月没有订购的客户的所有电子邮件地址。如果他们本月订购了任何类型的categoryID,那么我不想包含它们。

我正在使用此查询,但我认为它不是非常有效,它已经运行了很长时间。

SELECT 
    contactEmail, 
    (select max(orderDate) from orders o where o.customerID=orders.customerID) latestOrder 
FROM orders 
    WHERE categoryID='7' 
group by contactEmail
    HAVING latestOrder <= '2014-04-01 00:00:00'

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您不需要子查询。您已在主查询中引用orders

与此类似的东西应该有效(未经测试)

SELECT 
    contactEmail, 
    max(orderDate) as latestOrder
FROM orders 
    WHERE categoryID='7' 
group by customerID
    HAVING latestOrder <= '2014-04-01 00:00:00'

答案 1 :(得分:0)

我想你想要这样的东西:

SELECT contactEmail
FROM orders 
group by contactEmail
HAVING max(orderDate) <= '2014-04-01 00:00:00' and
       sum(category = '10') > 0;

请注意,这会将两个条件都放在having子句中,并且不会使用where子句进行过滤。