我有一个表(奖)通过中间表(AwardPerson)链接到另一个(人)。我想在一个查询中选择带有关联人员的奖励。 基本上我的查询看起来像这样:
SELECT Award.title
Person.name
FROM Award
OUTER JOIN AwardPerson ON Award.id = AwardPerson.award_id
JOIN Person ON AwardPerson.person_id = Person.id
现在我想添加分页,允许用户指定限制和偏移量。 如果我只是添加
LIMIT 5 OFFSET 25
如果我有多个人与一个奖项相关联,我将获得更少的奖励行。这是结果示例:
"Fastest pizza eater" "Bob"
"Fastest pizza eater" "Alice"
"Fastest pizza eater" "Mary"
"Biggest stomach" "John"
"Best manners" "Sam"
第一个奖项重复三次,因为一个奖励记录有3个AwardPerson记录。这就是为什么对于LIMIT 5的查询,我只获得了3个奖励实体。 但我想要的是5个奖项,无论有多少人参加。
我有什么办法可以LIMIT和OFFSET查询,它与多对多关系有联系吗?
我能想到的唯一解决方案是始终选择超过要求(如LIMIT * 3),然后删除额外的结果。但是这种方法对OFFSET不起作用(想象一下如何调整OFFSET 1000)。
此外,隐含要求此查询快速运行: - )
更新
我在Is it possible to LIMIT results from a JOIN query?中找到的解决方案是创建子查询,该子查询使用一些CASE-WHEN-ELSE逻辑添加新列。使用sqlalchemy实现这种方法太难了,所以我正在考虑从我的应用程序中删除偏移功能......
更新2
还有另一种解决方案。进行两次数据库查询。首先使用LIMIT选择SELECT DISTINCT award.id,然后使用IN条件获取整个请求。