[英]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.