【问题标题】:SQLAlchemy select from subquery and order by subquery fieldSQLAlchemy 从子查询中选择并按子查询字段排序
【发布时间】:2018-01-05 05:32:51
【问题描述】:

我有一个数据库表,其中包含 jsonb 字段中的推文。 我有一个查询来获取转发次数最多的推文,这就是它的样子:

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订购呢?

【问题讨论】:

    标签: python postgresql orm sqlalchemy flask-sqlalchemy


    【解决方案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 上阅读一般问题的答案。

    【讨论】:

      猜你喜欢
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 2014-10-15
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多