【问题标题】:Filtering with pagination分页过滤
【发布时间】:2012-01-03 21:57:36
【问题描述】:

如果这个解释不是 100% 清楚,我提前道歉。

我正在尝试根据用户的评分按顺序列出用户(然后按用户 ID 排序)。我实际上是在尝试对结果进行分页,因为可能会有大量结果。

我有两张桌子:

  • 表 A:带有“userid”列
  • 表 B:包含“rating”、“userid”和“groupid”列

还有其他列,但这些是这里的相关列。

每个用户都可以使用以下值提交组的评分:-1、0 或 1,这些值记录在“评分”中。通过获取与给定组对应的“状态”评级的净总和来评估每个组的净评级。

我有这个基本查询:

SELECT groupid, userid, SUM(rating) 
FROM A LEFT JOIN B ON A.userid = B.userid 
GROUP BY A.userid 
ORDER BY SUM(rating) DESC, A.userid ASC 

但是,我想分页,所以我需要能够根据之前显示的最后一个用户 ID 选择结果。

通常,根据用户 ID 大于显示的最后一个用户 ID 的任何结果过滤结果是很容易的。但是,由于我是根据 SUM(rating) 对结果进行排序,因此实际上没有顺序排序系统。

即使我在结果中的用户 ID 没有按顺序排序,是否有一种好方法可以过滤我的结果以进行分页?

【问题讨论】:

  • 你的主机是什么?还是只是纯 SQL?
  • 我能想到的唯一可能在这里工作的是创建另一个表格,其中填充了您的用户 ID 的评级顺序。当评级发生变化时,您将让您保持此更新日期。因此,当您运行整体查询时,请使用此表与您的表 B 连接,并在 order by 子句中使用此 order 字段

标签: php mysql pagination filtering


【解决方案1】:

您是否尝试过使用带偏移量的限制?

http://php.about.com/od/mysqlcommands/g/Limit_sql.htm

【讨论】:

  • 是的,我试过了。带偏移量的 LIMIT 工作正常。问题是获取“下一个”用户,该用户将基于显示的最后一个用户 ID。
  • 在我用 ?p=29 之类的东西解析 url 中的第一行之前,然后只需偏移限制,将 1 添加到该行号
  • 是的,试过了......问题是结果是根据总和(评级)而不是用户ID排序的。因为结果不是按用户 ID 顺序列出的,所以我不能指定类似 ?p=29 的内容。
  • 我已经用我自己的一个数据库表做了一个小例子,并且限制对我来说行号而不是 ids。如果我将“limit 30,20”放在带有 sum 列的语句的末尾,它会直接进入第 30 行并显示 20 个结果。忘记退货了!
  • 这是我开始的查询......但我需要添加限制偏移量(LIMIT 0, 10),例如 - 这不是问题。但是,我还需要有一个语句,只选择使用“最后一个”用户 ID 之后的结果。问题是对用户 ID 的简单比较是行不通的,因为结果不是基于用户 ID 的顺序。
猜你喜欢
  • 2018-01-13
  • 2020-12-10
  • 2016-06-11
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2015-08-12
  • 2019-08-17
相关资源
最近更新 更多