【问题标题】:SQLAlchemy : how to apply distinct before a filter in a join querySQLAlchemy:如何在连接查询中的过滤器之前应用 distinct
【发布时间】:2020-04-28 10:28:58
【问题描述】:

有没有办法在连接查询中过滤之前应用 distinct ?

我有 2 张桌子:

class User(db.Model):
  id = db.Column(db.Integer(), primary_key=True)

class Event(db.Model):
  id = db.Column(db.Integer(), primary_key=True)
  date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
  description = db.Column(db.String(80))
  user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
  user = db.relationship('User', backref=db.backref('events', lazy=True))

我想选择最近事件描述为空的所有用户。

我认为这会起作用:

User.query.join('events').order_by(Event.date).distinct(User.id).filter(Event.description==None)

但是,似乎在过滤器之后调用了 distinct。有没有办法在过滤之前强制应用 distinct ?

【问题讨论】:

    标签: sqlalchemy flask-sqlalchemy


    【解决方案1】:

    DISTINCT 用于返回不同的值。

    在这种情况下,您需要一个子查询来使用 GROUP BY 创建一个表,其中您将 Eventuser_id 分组并计算最近的事件:

    last_events = db.session.query(
                        Event.user_id, 
                        db.func.max(Event.date).label('last_event_date'),
                        Event.description)\
                            .group_by(Event.user_id)
                            .subquery()
    

    然后您可以将此表加入User 并根据 last_event_description 进行过滤:

    User.query.join(last_events,User.id==last_events.c.bac_id)
                .filter(last_events.c.description==None)
    

    等等!

    .c 来自于您在 SQLAlchemy 中访问子查询列的方式。

    【讨论】:

      猜你喜欢
      • 2020-11-04
      • 2016-05-08
      • 2018-02-22
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 2017-10-14
      • 2020-03-08
      • 2013-02-11
      相关资源
      最近更新 更多