我正在尝试运行这样的查询:
SELECT
comment_type_id, name, count(comment_type_id)
FROM
comments, commenttypes
WHERE
comment_type_id=commenttypes.id
GROUP BY
comment_type_id
如果comments
列没有commenttypes
和name
之间的联接,我可以使用以下方式执行此操作:
session.query(Comment.comment_type_id,func.count(Comment.comment_type_id)).group_by(Comment.comment_type_id).all()
然而,如果我尝试做这样的事情,我得到的结果不正确:
session.query(Comment.comment_type_id, Comment.comment_type, func.count(Comment.comment_type_id)).group_by(Comment.comment_type_id).all()
结果有两个问题:
(1, False, 82920)
(2, False, 588)
(3, False, 4278)
(4, False, 104370)
问题:
False
不正确我的预期结果是:
(1, 'Comment Type 1', 13820)
(2, 'Comment Type 2', 98)
(3, 'Comment Type 2', 713)
(4, 'Comment Type 2', 17395)
如何调整命令以提取正确的name
值和正确的计数?
我的模型定义如下所示:
class Comment(db.Model):
__tablename__ = 'comments'
id = Column(Integer, primary_key=True, unique=True)
comment_type_id = Column(Integer, ForeignKey('commenttypes.id'), nullable=False, index=True)
comment_type = relationship('CommentType', backref='comments')
class CommentType(db.Model):
__tablename__ = 'commenttypes'
id = Column(Integer, primary_key=True, unique=True)
name = Column(String(50, convert_unicode=True), nullable=False)
答案 0 :(得分:2)
下面应该这样做。您需要join
两个模型以及将所有非聚合列添加到group_by
子句(我知道并非所有RDBMS都严格要求,但我更安全)< / em>的
qry = (session.query(CommentType.id, CommentType.name,
func.count(CommentType.id).label('cnt'))
.select_from(CommentType).join(Comment)
.group_by(CommentType.id, CommentType.name)
)
答案 1 :(得分:1)
首先计算子查询中的计数,然后在最终查询中加入该计数。
# calculate the comment counts for each type in a subquery
sub = session.query(
CommentType.id,
func.count(Comment.id).label('count')
).join(CommentType.comments
).group_by(CommentType.id
).subquery()
# select types and counts by joining on subquery
types = session.query(CommentType, sub.c.count
).join((sub, sub.c.id == CommentType.id)
).all()