2014-04-02 134 views
0

我有一個表超過50,000個條目,少數用戶:的MySQL獲得最新條目從一大桌

transactions Table: 
ID 
USER 
VALUE 
TIMESTAMP 

users Table: 
USER 
TYPE 
REGION 

我想獲得最新的交易爲每個用戶。到目前爲止,我使用下面的GROUP BY語句,但它是緩慢的(需要5-10sec約):

select ID , max(TIMESTAMP) as TIMESTAMP from transactions group by USER; 

是否有快速的語句來檢索最新的條目?

+0

你只想要最新的TIMESTAMP?或完整記錄? – AK47

+0

正如Zafar所評論的,我提出的羣組錯誤,正確的說法是:GROUP BY USER – guiz

+0

請嘗試一次我的解決方案。 – AK47

回答

0

首先,根據我的理解,ID列應該在事務表中保留唯一值,因此應根據您的要求將其放在USER字段中。

此外,您可以嘗試下面的查詢。我不確定,但您可以將其時間與您的查詢進行比較並相應使用。

SELECT 
USER , TIMESTAMP 
FROM 
(SELECT USER,TIMESTAMP FROM transactions ORDER BY ID DESC) a 
GROUP BY USER; 

假設在USER列上會有一個索引,因爲這在兩個表之間是通用的。

+0

謝謝@ZafarMalik。我錯誤地輸入了原始查詢,因爲您提到它應該是「由USER分組」。另一方面,我認爲你忘了添加max(TIMESTAMP)。你的意思是在TRANSACTIONS表中索引USER列嗎?它應該不是唯一的索引它?我無法看到您的查詢的優勢,它首先對所有表進行排序,然後應用GROUP BY。我試過了,結果爲零。 – guiz

+0

不需要max(timestamp)作爲分組,只有在獲得降序後才提供第一行意味着最新的行。由於此最大功能,您的查詢速度很慢。如果USER列被索引,我的查詢可以給出更好的結果。 –

+0

嗨@ZafarMalik。以前,我錯誤地輸入了您的解決方案。我再次嘗試它,並且它的工作正常並且比原始的更快。從5.10秒降到3.40秒。我通過執行CREATE INDEX USER_ID ON TRANSACTIONS(USER(9))創建了一個索引;但它沒有加速查詢。 – guiz

-1

試試這個,

select u.*,tr.* from users as u 
outer apply 
    (
    select top 1 * from transactions as t 
     where t.USER= u.USER 
     order by t.ID desc 
)as tr 
+0

你的代碼是特定於SQL服務器的。問題是關於MySQL。您可以使用「限制1」而不是頂部。 –

+0

謝謝@ AK47。MySQL Workbench在這個SQL上發現一個錯誤。它強調了「外部」一詞,表明這裏存在問題。 – guiz

+0

雅,我給出的代碼是SQL Server。 – AK47