首页 > 解决方案 > SQLAlchemy 最多获得 N 个结果,其中每个类别少于 M

问题描述

我有三个表A, BC其中As 有Bs 和Bs 有Cs,就像 A 学校有课程(数学、文学)和课程有学生一样。同名B的 s 被认为是相同的,无论A它们属于哪个,相同的Cs也是如此B

我想查询As 的一个子集(简单filter),这样我最多得到N B每个不超过M Cs 的 s。

我已经阅读了很多方法来获得N每个类别的顶部,但甚至无法使用我的SQLite...查询(见下文)永远不会结束。

    subq = sess.query(
            C,
            func.row_number().over(
                partition_by=B.name,
                order_by=C.grade).label('n')).\
        filter(~A.name.startswith('something'), B.size==2, C.grade < threshold).\
        subquery()

    q_alias = aliased(Val, subq)
    q = sess.query(q_alias).filter(subq.c.n <= M)

这甚至是可行的还是我应该只查询所有并在 Python 中循环直到我到达N

编辑:

class A(Base):
    __tablename__ = 'a_objs'

    id      = Column(Integer, primary_key=True)
    name    = Column(String(128))

    b_list = relationship('B', cascade='all, delete-orphan', lazy='dynamic', back_populates='a')

class B(Base):
    __tablename__ = 'b_objs'

    id      = Column(Integer, primary_key=True)
    name    = Column(String(128))

    a_id = Column(Integer, ForeignKey('a_objs.id'))
    a = relationship('A', back_populates='b_list')

    c_list = relationship('C', cascade='all, delete-orphan', order_by='asc(C.grade)', back_populates='b')


class C(Base):
    __tablename__ = 'c_objs'

    id              = Column(Integer, primary_key=True)
    grade           = Column(Float)
    name            = Column(String(128))

    b_id = Column(Integer, ForeignKey('b_objs.id'))
    b = relationship('B', back_populates='c_list')

标签: pythonsqlitesqlalchemy

解决方案


推荐阅读