データベースからの値のリストについて最新の結果を得たいと思います。Django:dbから最新の値を得る方法
例:
Task
col1 col2
1 1
2 12
3 32
4 1
5 24
1 25
2 62
3 7
2 81
1 9 -> last occurence for '1' in 'col1'
4 10 -> last occurence for '4' in 'col1'
3 121
5 12 -> last occurence for '5' in 'col1'
あり、リスト「Z」はだと私はテーブルzはCOL1に存在するように「タスク」から最新の結果を得るような方法を照会書きたいです。 'Z' をされたと仮定すると:
z = [1, 4, 5]
私は最終的な結果を望むよう:
col1 col2
1 9
4 10
5 12
私が思いついた2つのソリューションがあります。
results = dict()
for x in z:
results[x] = Task.objects.filter(col1=x).reverse()[0]
を一緒に、このような私が唯一のデータベース呼び出しを作るために持っていることと、両方のソリューションを統合する方法があるなら、私は思ったんだけど、次のように
all_results = Task.objects.filter(col1__in=z)
results = dict()
for result in results:
results[result.col1] = result
対処方法2は次のように ソリューション1でありますそれぞれ異なる 'col1'の結果を取得します。 理由:私のデータベースは非常に大きく、現在はSolution2を実装しており、プロセス全体が非常に遅くなっています。ソリューション1は複数のエントリがあり、結果の辞書が非常に大きくなるため実行できません。そのため、非常に時間がかかるでしょう。
あなたは実行速度とスペースが気になるようです。私はこれが一つの方法かもしれないと思います:もし 'Task'テーブル更新の頻度を知っていれば最後の' n'行を取り出して( 'z'のものをフィルタリングするのではなく)取り出し、もしあればそれらの行を検索します「z」で。 'z'のすべての要素を見つけることができれば、あなたは良いことです。見つからない場合は、nをnに増やして、他のn行を取り出すことができます。スペースと時間を節約します。しかし、ここでの捉え方は、 'z'の項目の出現が頻繁に起こることです。 – stuartnox
@stuartnoxテーブルのサイズは数千万ではないにしても数千である。また、テーブルが頻繁に更新されるため、 'n'に割り当てる必要がある値は大きな議論になります。また、上記の例では、zは[6,7]のような値を保持することができ、[6,7]がテーブルに存在しないことがわかります。したがって、私が最後に達するまで、私は 'n'を更新し続けます。 –
列を注文するための別のキーがない場合(たとえば、で更新)、テーブルの順序が保証されているとは思いません。 http://stackoverflow.com/questions/20050341/when-no-order-by-is-specified-what-order-does-a-query-choose-for-your-record – Alexander