简体   繁体   English

嵌套联接子查询的SQLAlchemy计数函数

[英]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.idcategory_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM