我在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)
但我无法弄清楚正确的查询来计算每个用户有多少类别。
答案 0 :(得分:1)
例如,您可以在子查询中向categories
添加联接,并计算按Post.id
分组的不同category_id
和user_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也必须是不同的,这会在加入后显示为帖子的多行。