首页 > 解决方案 > 如何从 SQLAlchemy 的子查询中选择不在 Group By 中的列?

问题描述

我有一个嵌套查询,我需要在其中选择另一列,该列不存在于 GROUP BY 中并且未聚合。

我的表:

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

class Question(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    value = db.Column(db.Numeric)
    questioner_id = db.Column(db.Integer, db.ForeignKey('user.id'))

class Guess(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    amount = db.Column(db.Numeric)
    question_id = db.Column(db.Integer, db.ForeignKey('question.id'))

这里是我当前尝试的 SQLAlchemy 查询:

sub_query = db.session\
    .query(
        Guess.question_id, 
        db.func.max(Guess.amount).label('highest_amount')
    )\
    .group_by(Guess.question_id,).subquery()

query = db.session.query(Question, sub_query.c.highest_amount)\
    .join(sub_query, Question.id == sub_query.c.question_id)\
    .all()

到目前为止,一切都很好。我的子查询在给定问题的所有放置猜测中选择最高数量。

我的问题/问题:如何从子查询中选择最高金额的用户 ID?我需要过滤问题,其中最高金额的猜测不是提问者。基本上类似于.filter(Question.questioner_id !=highest_guess_user?)

我试图在 group_by 中添加 user_id 但这会导致废话。请注意,同一用户可能会提交多个猜测。

谢谢!

编辑:如果有帮助,请在RAW SQL下面找到:

SELECT 
  question.id AS question_id,
  questioner.id AS questioner_id,
  max_guess.max AS max_guess,  
FROM 
  question 
  JOIN (
    SELECT 
      guess.question_id AS question_id, 
      max(guess.amount) AS max 
    FROM 
      guess 
    GROUP BY 
      guess.question_id
  ) AS max_guess ON question.id = max_guess.question_id 
  LEFT OUTER JOIN "user" AS questioner ON questioner.id = question.questioner_id

标签: pythonsqlpostgresqlflaskflask-sqlalchemy

解决方案


推荐阅读