题
我需要在大型数据库表中找到记录的索引位置,以便将分页器预设到该项目的页面。我需要一个高效的 SQL 查询来给我这个数字。遗憾的是 SQL 不提供如下功能:
SELECT INDEX(*) FROM users WHERE userid='123'
有什么好主意吗?
编辑:让我们假设有一个 ORDER BY 子句附加到此。关键是我不想加载所有记录来定位特定记录的位置。我正在尝试打开一个寻呼机,转到包含先前选择的现有项目的页面 - 因为我想在允许用户选择不同项目的上下文中提供有关已选择项目的信息。
解决方案
您可能会使用类似(伪代码)的内容:
- 计数查询:$n = 从 {users} 中选择 count(uid),其中 ...(你的分页条件以userid 123为限制)
- $page = 楼层($n / $pager_size);
- 显示查询:从 {users} where 选择你想要的内容(你的分页条件没有限制),传递给 db_query_range(thequery, $page, $pager_size)
你真的应该看看 寻呼机查询, 不过,因为这就是它的全部内容,它基本上是这样工作的:计数查询和显示查询,但它尝试自动构建计数查询。
其他提示
假设您真的在询问如何在SQL Server 2005之后编写记录,请查看 David Hayden :
(您需要更改日期,描述为您的列)
CREATE PROCEDURE dbo.ShowUsers
@PageIndex INT,
@PageSize INT
AS
BEGIN
WITH UserEntries AS (
SELECT ROW_NUMBER() OVER (ORDER BY Date DESC) AS Row, Date, Description
FROM users)
SELECT Date, Description
FROM UserEntries
WHERE Row BETWEEN (@PageIndex - 1) * @PageSize + 1 AND @PageIndex * @PageSize
END
除非使用OrderBy子句,否则SQL不保证表中对象的顺序。换句话说,任何特定行的索引可能在后续查询中发生变化。你能描述一下你试图用寻呼机完成什么吗?
您可能对模拟MySQL中的Oracle的 rownum()
...如果你当然使用MySQL,因为它没有在问题中指定。
备注强>:
当然,您必须浏览网页的所有记录。您不需要从数据库服务器将它们提取回PHP页面,但您必须将它们包含在查询中。除了查询结果集之外,确定结果集中行的位置没有神奇的技巧,因为它可能因为where条件,顺序和组而改变。它需要在上下文中。
当然,如果所有行都是连续的,使用增量ID,则不删除任何行,并且您知道第一个和最后一个ID;然后你可以使用计数和简单的数学获得位置而不查询一切....但我怀疑这是你的情况,它永远不会。
不隶属于 StackOverflow