2011-05-27 91 views
1

我敢肯定,我實現了這個解決方案是最有效的(需要2秒的時候,在只有3萬條記錄運行來完成)。有更快的方法嗎?如何加快我的MySQL查詢獲取每個用戶最近一次交易的AVG?

我的MySQL查詢,然後在下面的解釋:

SELECT DATE(m.date) AS day, 
     AVG(t.amount) AS amount 
FROM transactions s 

      LEFT JOIN users m 
       ON m.id = s.user_id 
WHERE 
     #only consider the most recent transaction for each user 
     s.id = (
     SELECT id 
     FROM transactions s2 
     WHERE s2.user_id = s.user_id 
       AND s2.created_date = (
        SELECT MAX(created_date) 
        FROM transactions s3 
        WHERE s3.user_id = s.user_id 
       ) 
     ) 
GROUP BY day 
ORDER BY day; 

基本上它的說:「顯示每天的平均交易金額,只考慮每個用戶最近的交易」。

我已經創建了CREATED_DATE的索引。

我不想只是選擇MAX(transaction.id)用戶相關的交易,因爲不能保證添加到表新的交易記錄,始終是新的現實世界交易。

回答

3

三種選擇看起來太多了。

SELECT t.date, avg(t.amount) 
FROM transactions t 
JOIN 
    (SELECT user_id, max(created_date) AS max_date 
    FROM transactions GROUP BY user_id) AS t2 
ON t.user_id=t2.user_id and t.created_date=max_date 
GROUP BY t.date 
ORDER BY t.date; 

注意這包括在最近的一天,他有過任何交易的所有交易由給定用戶。似乎沒有時間戳。

確保有上user_id, created_date一個綜合指數。