按多对多关系的计数排序 - SQLAlchemy
我正在使用Flask-SQLAlchemy来查询我的Postgres数据库。
目前我正在尝试用以下查询来获取标题的建议:
res = Title.query.filter(Titles.name.ilike(searchstring)).limit(20)
到现在为止一切顺利。
现在我想根据每个标题对象的“订阅者”数量来对结果进行排序。
我知道有一个相关的StackOverflow问题:SQLAlchemy在多对多关系中按计数排序,但它的解决方案对我没有用。
我收到了以下错误:
ProgrammingError: (ProgrammingError) column "publishers_1.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: ...itles_name, count(titles_users.user_id) AS total, publishers...
(发布者与标题模型之间是一个一对多的关系)
我知道答案可能和子查询有关。
下面是我两个模型的简化示例。
# Many-to-Many relationship for user and titles
titles_users = db.Table('titles_users',
db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
db.Column('title_id', db.Integer, db.ForeignKey('titles.id'))
)
class User(db.Model, UserMixin):
__tablename__ = 'users'
# ids
id = db.Column(db.Integer, primary_key=True)
# Attributes
email = db.Column(db.String(255), unique=True)
full_name = db.Column(db.String(255))
pull_list = db.relationship(
'Title',
secondary=titles_users,
backref=db.backref('users', lazy='dynamic'),
lazy='joined'
)
class Title(db.Model):
__tablename__ = 'titles'
#: IDs
id = db.Column(db.Integer(), primary_key=True)
#: Attributes
name = db.Column(db.String(255))
1 个回答
4
下面的代码可以适用于你描述的模型:
q = (db.session.query(Title, func.count(names_users.c.user_id).label("total"))
.filter(Title.name.ilike(searchstring))
.outerjoin(names_users).group_by(Title).order_by('total DESC')
)
for x in q:
print(x)
不过,你的错误信息里包含了一些其他的数据,比如 publisher
之类的内容。所以如果上面的内容对你没有帮助,你应该在你的问题中添加更多的信息。