2012-02-04 204 views
0

我回来了与另一个MySQL查询问题。这次,在给定时间范围内,我需要选择客户上次订单的日期以及客户在该时间范围内订单的总数。SELECT COUNT,GROUP BY,ORDER BY

的(剥离)查询是这样的:

SELECT 
    customers_id, 
    customers_name, 
    date_purchased, 
    count(*) as total_order 
FROM orders 
GROUP BY customers_id; 

显然date_purchased回到那里是时间范围内的客户的最后一个订单的没有,但我可以不按组前预订,是无论如何要解决这个问题?例如,我应该先排序,然后按(嵌套选择)排序?

回答

3
select customers_id, 
     customers_name, 
     MAX(date_purchased) as last_purchase, 
     count(*) as total_order 
from orders 
group by customers_id,customers_name; 
+0

将'customers_name'添加到GROUP字段有什么意义? ID显然更独特。 – Slava 2012-02-04 09:07:03

+1

可能因为我来自SQL Server而不是MySQL背景MSSQL要求在GROUP BY中指定所有字段(如果它们未汇总) - 我猜MySQL不? – 2012-02-04 09:10:39

+0

我明白了。那不好意思了。是的,MySQL不需要GROUP BY中的所有未聚合字段,只是放置它看到的最后一个值。 – Slava 2012-02-04 09:12:32

2

MAX(date_purchased)如果它是DATE/DATETIME/TIMESTAMP列。如果是字符串,则需要将其转换为MAX(STR_TO_DATE(date_purchased, '%m-%d-%Y'))或其他任何格式。

关于日期范围...添加WHERE date_purchased BETWEEN '2012-01-01' AND '2012-02-04'或任何您的范围。如果开始/结束日期不是这种格式,则还需要使用STR_TO_DATE

0
select customers_id, 
     customers_name, 
     MAX(date_purchased) as most_current_purchase_within_range, 
     count(*) as total_amount_of_orders 
from orders 
where (date_purchased between ('2011-01-01') and ('2011-12-31')) 
group by customers_id