【问题标题】:SQLAlchemy: Order query by countSQLAlchemy:按计数排序查询
【发布时间】:2016-05-23 23:08:03
【问题描述】:

我想按帖子收到的点赞数对查询结果进行排序。 这是我的桌子:

class Card(Base):
   __tablename__ = 'cards'
   id = Column(Integer, primary_key=True)
   post_id = Column(Integer)
   voted = Column(Boolean)

@hybrid_property
def likes(self):
   likes = session.query(Card).filter(and_(Card.post_id == self.post_id, Card.voted == True)).count()
   return likes

@likes.expression
def likes(cls):
   return (select([func.count(Card.id)]).where(and_(Card.post_id == cls.post_id, Card.voted == True))

这是查询:

cards = session.query(Card).filter(Card.user_id == current_user.get_id()).order_by(desc(Card.likes)).all()

SQL 中的 order_by 部分,对我来说似乎很正确:

ORDER BY (SELECT count(cards.id) AS count_1 FROM cards WHERE cards.post_id = cards.post_id AND cards.voted = true) DESC

但是当我在查询之后调用它时:

for card in cards:
    print card.likes

输出不是降序而是完全随机的顺序。我现在唯一的猜测是,由于过滤器,计数仅在具有 card.user_id == current_user.id 的卡上执行。如果是这样(?),我如何按帖子收到的总点赞数排序我的查询结果?

我之前查过的东西:Hybrid Attributes 1,SQLAlchemy order by hybrid property 2

谢谢。

【问题讨论】:

  • 那个SQL肯定不对。 cards.post_id = cards.post_id 始终为真,所以每一行的 count_1 等于表中带有 voted = true 的卡片总数,这意味着排序只会给你没有特定顺序的行。您能否详细说明CardPost 和“喜欢”如何联系在一起?否则我们无法真正提出解决方案。
  • 您确定要查询Card 而不是Post 实例(按其卡片获得的票数排序)?

标签: python sql postgresql flask sqlalchemy


【解决方案1】:

老实说,我看不出你的 sql 语句是如何工作的,下面是对 postgresql order by 的引用。

http://www.postgresql.org/docs/9.4/static/queries-order.html http://www.tutorialspoint.com/postgresql/postgresql_having_clause.htm

而且我相信您的查询应该这样重写:

SQL:

SELECT count(cards.id) AS count_1, cards.id
FROM cards
GROUP BY count_1
HAVING cards.voted = true
ORDER BY count_1 DESC

但即便如此,在我看来还是有问题,我们可以看看你的 ERD 吗?

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 2013-04-17
    • 1970-01-01
    • 2011-06-25
    • 2019-02-20
    相关资源
    最近更新 更多