簡體   English   中英

SQL查詢以非常快的速度從2個組合表中獲取值

[英]SQL query for to get values from 2 combined table at very fast rate

我有2張桌子

              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

日志表中的每個用戶每5秒更新3次

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

我試過了

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

//這里的問題是,對於每個用戶而言,訂單不是最新的,而是Order by here對新表進行訂單,所以我嘗試了

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

但是面試官告訴這也是錯誤的,請指教。

這將為您提供每個用戶的最新日志條目。 如果您的表已正確索引,它應該很快。

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

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

使用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中測試此查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM