【问题标题】:How to get the position of a row in an arbitrary ordering?如何以任意顺序获取行的位置?
【发布时间】:2011-07-19 14:04:58
【问题描述】:

我正在对我的 SQL 结果进行分页(每页 10 个)。我想找出给定行(通过 URL 知道的id)在哪个页面上,以便我可以直接跳转到正确的页面。

排序是已知的,但不是简单的ORDER BY id ASC,所以我不能只计算行id < wanted_id

允许使用特定于 MySQL 的命令和子查询。我想避免变量

有什么办法吗?

编辑让自己清楚...

我有能力得到结果。我需要的是该行的 rank(即该行 before 的行数)。我不是在寻找蛮力方法(我宁愿检索 10k id 并以编程方式找到该排名)。

【问题讨论】:

  • 看起来下面的答案正在完整执行查询,找出页码然后检索它。我认为这个问题旨在避免完整的查询执行,这是使用分页的第一个原因。马塞尔,请澄清这不是故意的。
  • @isobar 已澄清。假设标题足够清晰。

标签: mysql sql pagination


【解决方案1】:

执行查询并将结果集插入到临时表中。 temp 应该有一个专用的自动增量列。

找到该行包含相关id的自增列的值,执行一些简单的算术计算该行所属的页面,并给出页面。

【讨论】:

  • 这可以工作,但我想我宁愿SELECT(id) 并在数组中找到索引。似乎在 MEM/CPU 上效率更高。
  • @Marcel Jackwerth:我一直在考虑类似的方法,直到我意识到您必须复制搜索逻辑。也就是说,如果我理解正确,您将不得不使用相同的逻辑两次:第一次检测页面时,第二次选择页面的所有数据。
  • 无论如何,我并没有坚持认为我的方法是最好的。
  • 为了明确一点:我的意思是所有操作都是单个(多语句)查询的一部分,所以最终客户端只会接收页面的行,而不是整个结果集。
【解决方案2】:

使用第二个查询SELECT COUNT(*) FROM ... WHERE ...。在 WHERE 子句中,将所选记录缩小到相关记录之前的记录。

【讨论】:

  • @MarcelJackwerth 我无法帮助你,因为我不知道你用来排序记录的表达方式。
【解决方案3】:
select *, 
_rowid, 
floor (_rowid / 10)  
from table

抱歉,错过了“无变量”要求。

您可以使用“限制”跳转到特定页面。

【讨论】:

  • 我希望有一个没有变量的解决方案 - 特别是因为这种方法不会比检索所有 ids 并以编程方式搜索它更好。
【解决方案4】:
select count(*) as rank_number
from my_table
order by c1, c2 desc
where 
    c1 <= (select c1 from my_table where id = @id)
    and
    c2 >= (select c2 from my_table where id = @id)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2017-07-18
    • 2012-01-04
    • 1970-01-01
    相关资源
    最近更新 更多