【问题标题】:SQLAlchemy distinct ignoring order_bySQLAlchemy 不同的忽略 order_by
【发布时间】:2020-12-19 09:45:28
【问题描述】:

我正在尝试使用 SQLAlchemy 从我的烧瓶应用程序运行查询,在该应用程序中,我按时间戳降序排列结果。从返回的订单中,我想提取不同的 sender_id。不幸的是 distinct 忽略了我请求的 order_by 并从标准表布局中提取数据。

messagesReceived = Message.query.filter_by(recipient_id=user_id).order_by(Message.timestamp.desc()).group_by(Message.sender_id).distinct()

我还是 SQLAlchemy 的新手,通过我完成的教程和课程,我没有遇到过这种情况,我尝试使用谷歌搜索,但我认为我的措辞不正确以获得答案。我目前正在尝试围绕子查询进行思考,因为我认为这可能是使其工作的一种方式,但同时在这里询问。

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您的 SQL 查询不合逻辑。您选择整条消息,但按person_id 分组。除非它是唯一的,否则不确定从哪一行中为组行选择值。 ORDER BY 在逻辑上在 GROUP BY 之后执行,并且由于 timestamp 现在是不确定的,因此结果顺序也是如此。一些 SQL DBMS 甚至不允许运行这样的查询,因为 SQL 标准不允许这样做。

    获取不同的sender_ids,按sender_id 的最新timestamp 排序

    messagesReceived = db.session.query(Message.sender_id).\
        filter_by(recipient_id=user_id).\
        group_by(Message.sender_id).\
        order_by(db.func.max(Message.timestamp))
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 PostgreSQL,

      messagesReceived = Message.query.filter_by(recipient_id=user_id).order_by(Message.sender_id.asc(), Message.timestamp.desc()).distinct(Message.sender_id).all()
      

      可能不需要按sender_id 分组。也可以在查询级别应用distinct(影响整个查询,而不仅仅是列),如here 所述,因此order_by 需要sender_id,post which,distinct 可以应用于特定列。

      不过,这可能是 PostgreSQL 特有的,所以如果您使用另一个数据库,我建议您使用 distinct 表达式,如 here 所述。

      从 sqlalchemy 导入不同的函数
      stmt = select([func.count(distinct(users_table.c.name))])

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        • 1970-01-01
        • 2021-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多