2014-02-20 158 views
1

擺脫2合併表中的值我有2個表SQL查詢以非常快的速度

   Users 
-------------------------------------------- 
Uid | Name | 
-------------------------------------------- 
    1 | sdfa | 
    2 | dsf  | 

和第二表作爲

  Log 
-------------------------------------------- 
Uid | log | size | file | time 
-------------------------------------------- 
    1 | dea | 2 | sadf | timestamp 
    1 | dea | 2 | sadf | timestamp 
    2 | eff | 25 | sadf | timestamp 

每用戶日誌表得到更新,每3倍5秒

我需要一個優化的QUERY來獲取表中每個用戶的名稱,日誌,大小,文件, 時間。用最新的更新記錄每個用戶。 即最近更新的用戶僅被顯示爲不是全部。

我試圖

SELECT DISTINCT userid, log, size,file,time FROM log 
WHERE userid IN (SELECT uid FROM users) As b ORDER BY time ASC 

//這裏的問題是,對每一位用戶順序不是最新 但這裏訂購訂單新表 所以,我想,

SELECT a.userid,a.name, b.log, b.size,b.file,b.time 
FROM users a LEFT JOIN ON log b WHERE a.userid=b.userid 
ORDER BY b.time ASC 

但面試官告訴這也是錯誤的,請諮詢。

+0

,不會是那麼'desc'? – bonCodigo

+0

對不起,這是ASC, 但面試官問,以非常快的速度這個查詢將無法正常工作,並要求我替代查詢,是否有任何其他方式 –

回答

1

MYSQL中沒有明顯的rank函數。但是你可以在這個問題上使用一個變量。

檢查樣本的SQLFIDDLE HERE。時間戳未格式化,您可以自行完成。

表用戶

UID  NAME 
1 a 
2 b 

表日誌

UID  LOG  SIZE FILE TIME 
1 lg1  2 f1 20140220173550 
1 lg2  2 f2 20140220173551 
2 lg3  25 f3 20140220173552 

檢查對每個問題的答案執行計劃找到最快的爲你的情況。

SELECT x.uid, u.name, x.log, x.size, x.file, 
x.time FROM users u INNER JOIN 
(
    SELECT l.uid, l.log, l.size, 
      l.file, l.time, 
      @curRank := @curRank + 1 AS rank 
    FROM logs l, (SELECT @curRank := 0) r 
    ORDER BY rank DESC 
) AS x 
ON u.uid = x.uid 
GROUP BY u.uid 
ORDER BY x.time DESC 

結果

UID  NAME LOG  SIZE FILE TIME 
2 b lg3  25 f3 20140220173552 
1 a lg2  2 f2 20140220173551 
如果你想通過最新的訂購
0

有了Oracle,你可以使用排名。但是,假設有與同一用戶的同一時刻沒有日誌,我們可以嘗試:

SELECT u.name, l2.log, l2.file, l2.size 
    FROM (SELECT l1.uid, max(time) as last_log 
      FROM Log l1 
     GROUP BY l1.uid) last_logs 
    JOIN Users u ON u.uid = last_logs.uid 
    JOIN Log l2 ON l2.uid = last_logs.uid 
       AND l2.time = last_logs.last_log 

這樣,我們只送最後日誌爲每個用戶。

免責聲明。我沒有在Mysql中測試過這個查詢。

1

這會給你每個用戶的最新日誌條目。如果你的表格被正確編入索引,它應該很快。

SELECT a.* 
FROM log a 
    INNER JOIN 
    (
     SELECT uid, MAX(timestamp) max_date 
     FROM log 
     GROUP BY uid 
    ) b ON a.uid = b.uid AND 
      a.timestamp = b.max_date 
join users u on u.uid = a.uid