2016-07-18 15 views
0

user_iddatetimeのログエントリのテーブルがあります。私はuser_idで各ログエントリの最新のものを取得するためのクエリを作成したいと思います。私はこのようなものになるだろう...それを行う方法を見つけ出すためにDjango ORMのサブクエリに参加して最新のものを取得

クエリのSQLを見えることはできません。

SELECT * 
FROM table a 
JOIN (SELECT user_id, max(datetime) maxDate 
     FROM table 
     GROUP BY user_id) b 
ON a.user_id = b.user_id AND a.datetime = b.maxDate 

は今、私は生のクエリでそれをやっているが、 ORMのメソッドを使用したいと思います。

+0

最後に、最も最近のエントリが必要ですが、 'user_id'だけを表示しますか? – jape

+0

@jape - 別々の 'user_id'ごとに最新のエントリを入れて、各行の他のカラムを取得します。 –

+0

@jape私は質問をより明確にする方法の提案をしています...私はそれを伝える方法がわからないので、私はSQLクエリを含めました。 –

答えて

1

私はこれが

Table.objects.order_by('-user_id').distinct('user_id') 

この中)(個別の参照をすべきとし - >https://docs.djangoproject.com/en/1.9/ref/models/querysets/

しかし、そのユーザの最新のログエントリはでそのユーザが最後のエントリである場合にのみ動作しますがテーブル、すなわちテーブル内で昇順にソートされた特定のユーザのログエントリ。

+0

これは、私が探している解決策を提供します(私はPostgresを使用していますが、私はこれを使っています)。 ORMでそれを行う方法をよりよく理解するためにORM。 –

+0

@TimTisdall、あなたはこれをより良い解決策にすることができます。 :) これを参照してください - > http://stackoverflow.com/questions/629551/how-to-query-as-group-by-in-django –

+0

私はそれを見ました...残念ながら '.annotate'はグループ化されたすべての値に対して 'GROUP BY 'を返します。私は 'user_id'と' max(datetime) 'だけでグループ化したいが、依然としてオブジェクト全体を返す。したがって、結果は内部サブクエリだけになりますが、結合にはなりません。 –

0

あなたが試すことがあります。

User.objects.latest().id 
+0

それはちょうど私に最新のエントリのIDを与えるでしょう。各IDの最新のエントリが必要です。 –

0
Table.objects.order_by('user_id', '-datetime').distinct('user_id') 

は(Meta.index_together = ['user_id', 'datetime']user_iddatetimeにインデックスを追加します。

+0

私が探している結果を得るには 'distinct( 'user_id')'する必要があるかもしれないと思います。 –

+0

@TimTisdallはい、確かに。編集されました。 –

関連する問題