【问题标题】:SQLAlchemy: How to joint two group bySQLAlchemy:如何联合两组
【发布时间】:2021-03-18 19:34:48
【问题描述】:

是否可以通过 SQLAchemy 联合两个组

done_1 = db.session.query(Tasks.user_1,func.count()).group_by(Tasks.user_1).all()
done_2 = db.session.query(Tasks.user_2,func.count()).group_by(Tasks.user_2).all()
all = done_1 + done_2

这只是两个不被用户统计的列表

【问题讨论】:

  • 您能否通过一个示例更好地解释数据库中的数据是什么以及您想要的预期结果是什么?
  • 每一行都是两个人的任务,我想计算每个人有多少任务。

标签: sqlalchemy flask-sqlalchemy


【解决方案1】:

假设您想使用 UNIONUNION ALL 运算符组合结果,并且只执行一个 sql 查询,下面应该从两个子查询中完成这项工作(注意删除 .all()):

done_1 = (
    session.query(
        Tasks.user_1.label("user"),
        func.count().label("count"),
    )
    .group_by(Tasks.user_1)
)
# .all()

done_2 = (
    session.query(
        Tasks.user_2,
        func.count()
    )
    .group_by(Tasks.user_2)
)
# .all()

stmt = union_all(done_1, done_2).subquery()
stmt = select([stmt])

for row in stmt.execute():
    print(row)

如果您想按名称访问结果,请注意使用 .label(...) 为返回的列命名(仅在第一次选择时需要):

print(row.user, row.count)

现在,如果同一用户值可能同时出现在 user_1user_2 字段中,则会报告两次。但是,如果需要将它们组合成一行,只需在执行前执行另一个步骤:

stmt = select([stmt.c.user, func.sum(stmt.c.count).label("count")]).group_by(stmt.c.user)

【讨论】:

  • sqlalchemy.exc.ProgrammingError: (psycopg2.errors.SyntaxError) FROM 中的子查询必须有别名
  • 通过将.subquery 添加到union_all 来修复。
猜你喜欢
  • 1970-01-01
  • 2016-01-04
  • 2014-08-02
  • 2013-01-18
  • 2021-11-06
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多