【问题标题】:SQLAlchemy ordering by count on a many to many relationshipSQLAlchemy按多对多关系排序
【发布时间】:2011-08-23 19:58:48
【问题描述】:

这是我当前模型的简化示例(我使用的是Flask SQLAlchemy extension

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赞数 来订购它。

这是我基本上试图发出的查询:

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 方面进行任何工作。

感谢任何人提供的任何帮助。

【问题讨论】:

    标签: python orm sqlalchemy flask flask-sqlalchemy


    【解决方案1】:

    我没有太多使用 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_byPost再用order_by

    db.session.query(Post, func.count(likes.c.user_id).label('total')).join(likes).group_by(Post).order_by('total DESC')
    

    我发现ORM tutorial 和 SQLAlchemy 文档的其余部分非常有用。

    【讨论】:

    • 您好,谢谢您的回答。不过有几点需要注意。查询末尾有一个额外的括号。 MySQL 不喜欢 '-total' (尽管'total DESC' 工作正常)。此外,我认为将 ID 分组为.group_by(Post.id) 可能会更好。最后我遇到了func.count(likes) 的问题。它正在转换为空计数 (COUNT())。通过func.count(likes.c.did) 提供一列修复它。再次感谢。
    • @anomareh 太好了,很高兴它有帮助。我会更新我的答案,以便它(希望)更通用。我想知道不同的 SQLAlchemy 版本在这里是否重要?我使用的是 0.7b4。
    • 你先生是救命稻草。
    猜你喜欢
    • 2014-08-25
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多