簡體   English   中英

為什么mysql查詢返回錯誤結果?

[英]Why mysql query is returning wrong Results?

我試圖在我的MySQL數據庫中找到最新的日志條目。 我昨晚做了這個查詢,但今天測試后似乎沒有返回正確的數據。

SELECT MAX(id), hostName, email, info, time 
FROM log
WHERE time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) 
GROUP BY hostName 
ORDER BY `time` DESC

查詢運行得很好,但其他字段似乎都沒有匹配id列。 它抓取最大ID號,但hostName,email和info與id不匹配,並且它們不是最新的。 我已經花了幾個小時在我的車輪上旋轉(我是一個MySQL菜鳥,只是為了好玩而這樣做)所以我現在很困惑..

謝謝你的幫助!

編輯:哇謝謝所有的回復! 對不起,我應該說“我想要每個主機名最新的日志!” < - 這是我特別需要的。

你說:

我試圖在我的MySQL數據庫中找到最新的日志條目

無需分組或使用子查詢。 試試這個:

SELECT id, hostName, email, info, time FROM log
WHERE time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) 
ORDER BY `time` DESC

現在你說:

我想要每個主機名的最新日志!

然后解決方案應該是這樣的:

SELECT l1.id, l1.hostName, l1.email, l1.info, l1.time FROM log l1
LEFT JOIN log l2 on l1.hostName = l2.hostName AND l1.time < l2.time
WHERE l2.time IS NULL
ORDER BY l1.time DESC

如果您想要與每個不同hostName的max id對應的完整行,

SELECT id, hostName, email, info, time
FROM log
WHERE id IN 
    (SELECT MAX(id) FROM log WHERE time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) 
     GROUP BY hostName)
ORDER BY `time` DESC

另一種做同樣事情的方法是GROUP BY然后JOIN到日志表:

如果“latest”表示最大id ,請使用(hostname, time, id)索引,並且:

SELECT log.id
FROM 
        log
    JOIN 
        ( SELECT MAX(id) AS id
          FROM log
          WHERE time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) 
          GROUP BY hostName
        ) AS grp
      ON grp.id = log.id ;

更新 :您可能還想嘗試這個。 它可能更有效(取決於主機名分布) - 並將受益於索引: (hostname, id, time)索引:

SELECT log.id
FROM 
        log
    JOIN 
        ( SELECT MAX(id) AS id
          FROM log
          GROUP BY hostName
        ) AS grp
      ON grp.id = log.id 
WHERE log.time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) ;

如果“最新”表示最time (例如,如果timeinsertion_time且以后未更改),請使用(hostname, time)索引,並且:

SELECT log.*
FROM 
        log
    JOIN 
        ( SELECT hostname, MAX(time) AS max_time
          FROM log
          WHERE time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) 
          GROUP BY hostname
        ) AS grp
      ON  grp.hostname = log.hostname
      AND grp.max_time = log.time ;

最后,因為每個人都忘了回答“為什么mysql查詢返回錯誤的結果?” 問題,這是另一個有一些有用答案的問題: 為什么MySQL會添加一個與SQL標准沖突的功能?

這是一個着名的:

SELECT *
FROM log
WHERE log.id IN (
    SELECT MAX(id)
    FROM log
    WHERE time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) 
    GROUP BY hostName) T

暫無
暫無

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

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