У меня 3 модели: Trail
, Review
и Attribute
. Trail
может иметь много Reviews
, а Review
может иметь много Attributes
(через модель ReviewAttribute
). Я хочу получить все Trails
верхние N Attributes
, где «верхние N» означает верхние N Attributes
в большинстве обзоров для следа, поэтому в основном дан след, подсчитайте его сгруппированные атрибуты, отсортируйте по количеству, и возьмите верхний N.
Соответствующий код для моделей:
class Trail(Base):
id = Column(Integer(), primary_key=True)
# One to many
reviews = relationship("Review", lazy=True)
reviewAttributes = relationship(
'ReviewAttribute',
primaryjoin='and_(Trail.id == Review.trailId)',
secondary='join(Review, ReviewAttribute, Review.id == ReviewAttribute.reviewId)',
viewonly=True,
lazy=True
)
class Review(Base):
id = Column(Integer(), primary_key=True)
trailId = Column(BigInteger(), ForeignKey('trails.id'))
# One to many
trail = relationship("Trail", back_populates="reviews", lazy=True)
class Attribute(Base):
id = Column(Integer(), primary_key=True)
attributeLabel = Column(String())
class ReviewAttribute(Base):
reviewId = Column(BigInteger(), ForeignKey('reviews.id'), primary_key=True)
attributeId = Column(BigInteger(), ForeignKey('attribute_labels.id'), primary_key=True)
# Many to many
attribute = relationship("Attribute", lazy=True)
review = relationship("Review", lazy=True)
Я могу получить все Attributes
на Trail
через связь reviewAttributes
, но не могу выяснить, как смоделировать отношения или запрос, чтобы получить только 3 лучших по количеству. Я смог сделать это в python, используя collections.Counter
из этого отношения, но хотел бы сделать это в SQL, если это возможно для эффективности.