2017-07-29 209 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的一般問題的解答。