1

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 番号を取得しますが、ホスト名、電子メール、および情報が ID と一致せず、最新のものではありません。私はこれに車輪を回すのに数時間を費やしました(私はMySQLの初心者で、楽しみのためにこれをやっているだけです)ので、今はかなり混乱しています..

助けてくれてありがとう!

編集:すべての応答に感謝します!混乱して申し訳ありません。「ホスト名ごとに最新のログが必要です!」と言うべきでした。<-それは私が特に必要としているものです。

4

4 に答える 4

2

あなたが言った:

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
于 2012-06-15T13:40:28.343 に答える
1

同じことを行う別の方法はGROUP BY、次にJOINログ テーブルに移動することです。

「最新」が最大を意味する場合は、インデックスとこれ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 標準と競合する機能を追加するのですか?

于 2012-06-15T13:49:54.053 に答える
1

各個別の最大 id に対応する完全な行が必要な場合はhostName

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
于 2012-06-15T13:39:22.487 に答える
0

これは有名なものです:

SELECT *
FROM log
WHERE log.id IN (
    SELECT MAX(id)
    FROM log
    WHERE time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) 
    GROUP BY hostName) T
于 2012-06-15T13:39:13.440 に答える