1

我需要在大型数据库表中定位记录的索引位置,以便将寻呼机预设到该项目的页面。我需要一个可以给我这个数字的高效 SQL 查询。可悲的是 SQL 不提供类似的东西:

SELECT INDEX(*) FROM users WHERE userid='123'

有什么好主意吗?

编辑:假设这里附加了一个 ORDER BY 子句。关键是我不想加载所有记录来定位特定记录的位置。我正在尝试打开一个寻呼机到包含先前已选择的现有项目的页面 - 因为我想在允许用户选择其他项目的上下文中提供有关该已选择项目的信息。

4

4 回答 4

3

您可能会使用类似(伪代码)的东西:

  • 计数查询: $n = select count(uid) from {users} where ...(您的分页条件包括用户 ID 123 作为限制)
  • $page = floor($n / $pager_size);
  • 显示查询:从 {users} 中选择什么,你,想要什么(你的分页条件没有限制),传递给 db_query_range(thequery, $page, $pager_size)

但是,您应该真正查看pager_query,因为这就是它的全部内容,并且它基本上是这样工作的:计数查询和显示查询,除了它尝试自动构建计数查询。

于 2009-03-06T13:00:23.340 回答
1

假设您真的在询问如何在 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 
于 2009-03-06T06:02:31.130 回答
0

SQL 不保证表中对象的顺序,除非您使用 OrderBy 子句。换句话说,任何特定行的索引都可能在后续查询中发生变化。你能描述一下你想用寻呼机完成什么吗?

于 2009-03-06T04:26:40.877 回答
0

您可能对在 MySQL 中模拟rownum()Oracle 的东西感兴趣……当然,如果您使用的是 MySQL,因为它没有在问题中指定。


备注

当然,您必须查看页面的所有记录才能正常工作。您不需要将它们从数据库服务器取回 PHP 页面,但您必须将它们包含在查询中。除了查询结果集之外,没有什么魔术可以确定行在结果集中的位置,因为它可能会因为 where 条件、订单和组而改变。它需要在上下文中。

当然,如果你所有的行都是连续的,有递增的 id,没有一个会被删除,而且你知道第一个和最后一个 id;那么您可以使用计数并通过简单的数学获得位置而无需查询所有内容....但我怀疑这是您的情况,从来都不是。

于 2009-03-06T04:46:36.257 回答