25

次のフィールドを持つ mysql テーブルに、さまざまな rpc 呼び出しへの応答を保存しています。

Table: rpc_responses

timestamp   (date)
method      (varchar)
id          (varchar)
response    (mediumtext)

PRIMARY KEY(timestamp,method,id)

methodとのすべての既存の組み合わせに対して最新の応答を選択する最良の方法は何idですか?

  • 日付ごとに、特定のメソッド/ID に対して 1 つの応答しか存在できません。

  • 特定の日付にすべての呼び出しの組み合わせが存在するとは限りません。

  • 数十のメソッド、数千の ID、少なくとも 365 の異なる日付があります

サンプルデータ:

timestamp  method  id response
2009-01-10 getThud 16 "....."
2009-01-10 getFoo  12 "....."
2009-01-10 getBar  12 "....."
2009-01-11 getFoo  12 "....."
2009-01-11 getBar  16 "....."

望ましい結果:

2009-01-10 getThud 16 "....."
2009-01-10 getBar 12 "....."
2009-01-11 getFoo 12 "....."
2009-01-11 getBar 16 "....."

(これは同じ質問ではないと思います-最新のものは得られませんresponse

4

7 に答える 7

28

このソリューションは最近更新されました。
以下のコメントは古くなっている可能性があります

結合がないため、このクエリは適切に実行される可能性があります。

SELECT * FROM (
    SELECT *,if(@last_method=method,0,1) as new_method_group,@last_method:=method 
    FROM rpc_responses 
    ORDER BY method,timestamp DESC
) as t1
WHERE new_method_group=1;

このソリューションごとに 1 つの結果行がmethod必要な場合、mysql 変数を使用して JOIN を回避します。

参考までに、PostgreSQL にはこれを行う方法が言語に組み込まれています。

SELECT DISTINCT ON (method) timestamp, method, id, response
FROM rpc_responses
WHERE 1 # some where clause here
ORDER BY method, timestamp DESC
于 2012-09-27T16:11:23.303 に答える
14

自己回答ですが、テーブルが大きくなるにつれて、それが十分に効率的な解決策になるかどうかはわかりません。

SELECT timestamp,method,id,response FROM rpc_responses 
INNER JOIN
(SELECT max(timestamp),method,id FROM rpc_responses GROUP BY method,id) latest
USING (timestamp,method,id);
于 2009-01-12T15:12:37.747 に答える
6

これを試して...

SELECT o1.id, o1.timestamp, o1.method, o1.response   
FROM rpc_responses o1
WHERE o1.timestamp = ( SELECT max(o2.timestamp)
                       FROM rpc_responses o2
                       WHERE o1.id = o2.id )
ORDER BY o1.timestamp, o1.method, o1.response

... Accessでも機能します!

于 2010-07-06T11:05:27.743 に答える
0

私はこれを使用し、私のために働いた

select max(timestamp),method,id from tables where 1 group by method,id order by timestamp desc 
于 2012-05-03T13:32:33.893 に答える
0

データセットが大きくなると、サブクエリは非常に負担になります。

これを試して:

SELECT t1.* 
FROM rpc_responses AS t1 
INNER JOIN rpc_responses AS t2 
GROUP BY t1.method, t1.id, t1.timestamp
HAVING t1.timestamp=MAX(t2.timestamp)    
ORDER BY t1.timestamp, t1.method, t1.response;
于 2011-07-26T16:40:01.663 に答える
-4

...1年以上経っていますが、最新のものから始まるすべてのクエリを選択するには、誰かを助けるかもしれません

SELECT *
FROM rpc_responses
ORDER BY timestamp DESC
于 2010-06-06T09:25:05.457 に答える