表中记录的索引

时间:2009-03-06 04:18:28

标签: sql drupal pagination

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

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

有什么好主意吗?

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

4 个答案:

答案 0 :(得分:3)

您可能会使用类似(伪代码)的内容:

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

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

答案 1 :(得分: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 

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可能对MySQL中simulates the rownum()的某些内容感兴趣...如果您使用的是MySQL,那么问题中没有指定。


备注

当然,您必须浏览网页的所有记录。您不需要从数据库服务器将它们提取回PHP页面,但您必须将它们包含在查询中。除了查询结果集之外,确定结果集中行的位置没有神奇的技巧,因为它可能因为where条件,顺序和组而改变。它需要在上下文中。

当然,如果所有行都是连续的,使用增量ID,则不删除任何行,并且您知道第一个和最后一个ID;然后你可以使用计数和简单的数学获得位置而不查询一切....但我怀疑这是你的情况,它永远不会。