2017-07-29 211 views
0

我在jsonb字段中有一个包含推文的数据库表。 我有一个查询得到的最转推下令鸣叫,这是什么样子: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 

我试图创建此查询与SQLAlchemy的,这是我走到这一步:

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

它可能不会产生您显示的确切查询,但应指向正确的方向:您可以在order_by中使用标签'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的一般问题的解答。