2012-02-04 153 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