LIMIT可以应用于分组结果,但仍然可以获得所有行吗?

时间:2011-01-17 18:17:37

标签: sql mysql search-engine

我有一张桌子,上面有书籍,一张桌子上有作者,另一张桌子上有书籍和作者。一本书可以有多个作者,所以当我对this results进行大查询时,如果该书有多个作者,我每本书可能会得到多行。然后我将结果合并到PHP中,但问题是如果我对分页的查询进行限制 - OFFSET,我每页可能会得到少于25个(期望的)唯一书籍。

任何人都可以想到一种(或者有一种内置的)方式让LIMIT影响分组查询,但仍能获得所有结果吗?我宁愿不做一个分组查询,然后做其他查询来获取每个作者,因为我失去了缓存结果的好处。

如果没有,我可能会预先保存缓存的结果,然后分别查询每个作者。

3 个答案:

答案 0 :(得分:1)

您可以使用两种方法:

  • 使用n + 1个查询。
  • 使用变量模拟MySQL中的ROW_NUMBER() OVER (PARTITION BY your_group),并仅选择行号为25或更少的行。

第二个很难正确编写。

答案 1 :(得分:1)

我在不同的用例(影院预订系统)中遇到了同样的问题,经过一些研究和测试后,我使用了预通过法。它快速而干净,即使有大量行(在我的情况下,超过600k)也能很好地工作。希望能帮助到你! :)

答案 2 :(得分:1)

已经有一个已接受的答案,但我认为这可能有用。

GROUP_CONCAT允许您将多行合并到MySQL查询中的单个行中。使用它,您可以将作者连接到列表中作为一个字段。

SELECT GROUP_CONCAT(author) FROM books GROUP BY book_id;

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat