2014-04-13 57 views
1

我需要一個更好的方式從我擁有的某些表中檢索前10個不同的UID。Top-10 mysql查詢

的設置:

  • 表user_view_tracker
  • 包含對{用戶ID(UID),時間戳(TS)}
  • 每天都在增長的(今天是41K項)

我的目標:

  • 要產生10強觀看次數最多的用戶ID在該表user_view_tracker

我當前的代碼工作,但慢慢地查殺數據庫:

select 
distinct uvt.uid as UID, 
(select count(*) from user_view_tracker temp where temp.uid=uvt.uid and temp.ts>date_sub(now(),interval 1 month)) as CLICK 
from user_view_tracker uvt 
order by CLICK 
limit 10 

這是相當明顯的是不同的數據結構會有所幫助。但我現在還不能這樣做。

回答

1

首先,刪除子查詢,這應該是足夠的;)

select 
    uvt.uid as UID 
    ,count(*) as CLICK 
from 
    user_view_tracker uvt 
where 
    uvt.ts > date_sub(now(),interval 1 month) 
group by 
    uvt.uid 
order by CLICK DESC 
limit 10 
+0

編輯,你是對的。我想知道他的代碼爲什麼工作:D – Ryx5

+0

談論沒有DESC的順序 – Ryx5

1

嘗試:

select uid, count(*) as num_stamps 
    from user_view_tracker 
where ts > date_sub(now(), interval 1 month) 
group by uid 
order by 2 desc limit 10 

我一直在你的標準,只要獲得計數剛剛過去的一個月。如果要計算全部,可以刪除該行。

刪除DISTINCT應該可以提高性能。如果您在外部查詢和uid組中進行聚合,則沒有必要這樣做,因爲這會將數據聚合到每個具有計數的uid的一行。