如何限制使用多对多关系连接的SQL查询?

时间:2015-10-15 20:06:53

标签: sql join limit offset

我有一个表(奖)通过中间表(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条件获取整个请求。

0 个答案:

没有答案