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

时间:2016-12-28 12:27:02

标签: python sqlalchemy

我在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))

我可以通过这样的子查询来计算每个用户有多少帖子:

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)

但我无法弄清楚正确的查询来计算每个用户有多少类别。

1 个答案:

答案 0 :(得分:1)

例如,您可以在子查询中向categories添加联接,并计算按Post.id分组的不同category_iduser_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)

如果帖子有多个类别,帖子ID也必须是不同的,这会在加入后显示为帖子的多行。