[英]SQLAlchemy count function for nested join subquery
I'm very new at SQLAlchemy and as you can see I have 3 models: 我是SQLAlchemy的新手,您可以看到我有3个模型:
categories = db.Table(
'categories',
db.Column('post_id', db.Integer, db.ForeignKey('post.id')),
db.Column('category_id', db.Integer, db.ForeignKey('category.id'))
)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
nickname = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
posts = db.relationship('Post', backref='author', lazy='dynamic')
about_me = db.Column(db.String(140))
last_seen = db.Column(db.DateTime)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
body = db.Column(db.String(140))
timestamp = db.Column(db.DateTime)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
categories = db.relationship("Category",
secondary="categories",
backref="posts")
class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100))
I can count how many post each user has by some subquery like this: 我可以通过这样的子查询计算每个用户有多少个帖子:
stmt = db.session.query(models.Post.user_id, func.count('*').label('post_count')).group_by(models.Post.user_id).subquery()
db.session.query(models.User, stmt.c.post_count).outerjoin(stmt, models.User.id==stmt.c.user_id).order_by(models.User.id)
but I can't figure it out the right query to calculate how many categories each users has. 但我无法找出正确的查询来计算每个用户拥有多少个类别。
You could for example add a join to categories
in your subquery and count distinct Post.id
s and category_id
s grouped by user_id
: 例如,您可以向子查询中的
categories
添加Post.id
并计算由user_id
分组的不同Post.id
和category_id
:
stmt = db.session.query(
models.Post.user_id,
func.count(models.Post.id.distinct()).
label('post_count'),
func.count(models.categories.c.category_id.distinct()).
label('category_count')
).\
join(models.categories).\
group_by(models.Post.user_id).\
subquery()
db.session.query(models.User,
stmt.c.post_count,
stmt.c.category_count).\
outerjoin(stmt, models.User.id==stmt.c.user_id).\
order_by(models.User.id)
The post id's have to be distinct as well in case a post has multiple categories, which will manifest as multiple rows for the post after the join. 如果帖子具有多个类别,则帖子ID也必须是不同的,在合并之后,该ID将显示为该帖子的多个行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.