2017-07-29 12 views
0

jsonbフィールドにつぶやきを含むデータベーステーブルがあります。 私が最もリツイート順ツイートを取得するクエリを持っている、これは次のようにそれが見えるものです:私は今のところ得たところ、私はSQLAlchemyので、このクエリを作成しようとしているSQLAlchemyサブクエリフィールドから選択サブクエリフィールドから

SELECT * FROM (
    SELECT DISTINCT ON (raw->'retweeted_status'->'id_str') 
    raw->'retweeted_status' as status, 
    raw->'retweeted_status'->'retweet_count' as cnt 
    FROM tweet 
    WHERE (raw->'retweeted_status') is not null 
    ORDER BY raw->'retweeted_status'->'id_str', cnt DESC 
) t 
ORDER BY cnt DESC 

、これは次のようになります。

session.query(Tweet.raw['retweeted_status'], 
     Tweet.raw['retweeted_status']['retweet_count'].label('cnt'))\ 
     .filter(~Tweet.raw.has_key('retweeted_status'))\ 
     .distinct(Tweet.raw['retweeted_status']['id_str']).order_by(Tweet.raw['retweeted_status']['id_str'].desc()).subquery() 

しかし、それをcntで注文するにはどうすればいいですか?

答えて

1

表示された正確なクエリを生成しない可能性がありますが、正しい方向を示す必要があります。'cnt'をに入れると、.order_by('cnt')となります。

さらに、sqlalchemy.desc関数の引数としてラベルを使用できます。総括:

from sqlalchemy import desc 

q = (
    session.query(
     Tweet.raw['retweeted_status'], 
     Tweet.raw['retweeted_status']['retweet_count'].label('cnt') 
    ) 
    .filter(~Tweet.raw.has_key('retweeted_status')) 
    .distinct(
     Tweet.raw['retweeted_status']['id_str'] 
    ) 
    .order_by(desc('cnt')) 
).subquery() 

追加ヒント:あなたは括弧に入れてうまくている場合、あなたのクエリをフォーマットすることができます。

python sqlalchemy label usageの一般的な質問に対する回答もご覧ください。

関連する問題