这是我当前模型的简化示例(我正在使用Flask SQLAlchemy扩展):
like = db.Table( 'like', db.Column('uid', db.Integer, db.ForeignKey('users.id')), db.Column('pid', db.Integer, db.ForeignKey('posts.id')) ) class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key = True) username = db.Column(db.String(20)) class Post(db.Model): __tablename__ = 'posts' id = db.Column(db.Integer, primary_key = True) title = db.Column(db.String(255)) likes = db.relationship( 'User', secondary = like, backref = db.backref('likes', lazy = 'dynamic'), lazy = 'dynamic' )
我正在尝试Post按喜欢的次数订购。
Post
这是我基本上想发出的查询:
SELECT p.*, COUNT(l.`pid`) as `likes` FROM `posts` as p LEFT JOIN `like` as l ON p.`id` = l.`pid` GROUP BY p.`id` ORDER BY `likes` DESC
我只是无法在SQLAlchemy方面进行任何工作。
感谢您提供任何帮助。
我没有使用SQLAlchemy,所以我想尝试一下。我没有尝试使用你的模型,我只是写了一些新模型(尽管足够类似):
likes = db.Table('likes', db.Column('user_id', db.Integer, db.ForeignKey('user.id')), db.Column('post_id', db.Integer, db.ForeignKey('post.id')) ) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(20)) def __repr__(self): return "<User('%s')>" % self.username class Post(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(255)) likes = db.relationship('User', secondary = likes, backref = db.backref('posts', lazy='dynamic')) def __repr__(self): return "<Post('%s')>" % self.title
你想要加入likes表格,用于func.count计算喜欢数,group_by Post然后使用order_by:
db.session.query(Post, func.count(likes.c.user_id).label('total')).join(likes).group_by(Post).order_by('total DESC')
我发现ORM教程和SQLAlchemy文档的其余部分非常有用。