【问题标题】:Can LIMIT be applied to grouped results, but still get all the rows?LIMIT 是否可以应用于分组结果,但仍可以获得所有行?
【发布时间】:2011-01-20 13:23:56
【问题描述】:

我有一个包含书籍的表格,一个包含作者的表格,以及一个将书籍与作者联系起来的表格。一本书可以有多个作者,所以当我对this results 进行大查询时,如果这本书有多个作者,每本书可能会得到不止一行。然后我将 PHP 中的结果合并在一起,但问题是,如果我 LIMIT - OFFSET 分页查询,每页可能会得到少于 25 个(所需的)唯一书籍。

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

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

【问题讨论】:

    标签: sql mysql search-engine


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以使用两种方法:

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

      第二个很难写好。

      【讨论】:

      • 我想了解更多关于这个 OVER(PARTITION BY 事物,我会搜索,感谢数据
      • @Lacrymology:不幸的是,MySQL 不支持 ROW_NUMBER,因此您必须稍微调整一下变量才能使其正常工作。
      【解决方案3】:

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

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-24
        • 2018-09-25
        • 2012-08-31
        • 2019-05-29
        • 2011-10-22
        • 1970-01-01
        • 2011-01-27
        • 2022-11-08
        相关资源
        最近更新 更多