我有一个表"文档",有一个id列,它是主键。该表具有许多其他字段,用户可以查看通过引用许多这些字段排序的表。表数据显示在虚拟树控件中,该控件仅请求树当前客户区所需的数据。
假设我的文档表具有以下结构和数据(它没有,但是简单的例如下面的内容很有希望说明)
id description date_of_doc
----------------------------------
1 Doc 1 10/05/1987
2 Doc 2 11/06/1988
3 Doc 3 12/07/1989
4 Doc 4 13/08/1990
5 Doc 5 14/09/1991
6 Doc 6 15/10/1992
我的虚拟控件按照id顺序加载日期,按照默认的表顺序。
但是,该控件允许您单击名为" description"的标题。和" date_of_doc"。单击这些标题会更改数据在控件中的显示顺序。单击相同的标题两次,它将按降序排序。我发出一个新的查询来获取数据" ORDER BY"命令取决于单击的标题。
因此,如果我按date_of_doc排序并且它正在降序,那么id 2的新位置实际上就是5.对我的用户进行排序然后点击"按ID查找"链接以查找ID为#34; 2"的文档。我现在需要将他带到树控件中的正确节点以查找此文档。从上面的简单数据集中我们可以看出树中这个位置的新索引是5.但是如何使用考虑Order by子句的查询来做到这一点。
目前我正在使用相同的Order by为表中的每一行选择id字段,然后遍历查询结果,直到我可以将文档id与用户请求的id匹配。这个查询没有任何问题,因为它让我获得了正确的位置,它只是让我觉得非常低效,特别是因为我需要处理大型表格。
我正在寻找的是一个类似
的查询SELECT row_num FROM documents WHERE id = 12345 ORDER BY date_of_doc
答案 0 :(得分:0)
但是,该控件允许您单击被调用的标头 “description”和“date_of_doc”。单击这些标题会更改 数据在控件中显示的顺序。点击相同 标题两次,它将降序排序。我发出一个新的查询来获取 带有“ORDER BY”命令的数据,具体取决于标题 点击。
这不是很有效,因为每当有人试图对列进行排序时,它就会不必要地命中数据库。您可以按用户数检索一次数据,并将数据缓存在Web服务器内存中并在内存中进行排序。或者使用一些客户端排序技术使用许多javascript库...我不是这些技术的专家,但你应该能够找到关于这个主题的帮助,因为这是一个非常常见的场景。此外,您还没有提到用于构建Web应用程序的技术堆栈。 C#asp.net,java,php等...
因此,假设我们在内存中进行排序,对db的唯一其他调用是获取特定请求文档的文档。
这说明你需要避免迭代行来查找 为此,您可以编写一个存储过程,该过程接受DocID并返回记录集,因此(只需伪代码可能需要根据您的实际情况进行调整):
Create GetDocDetailsByID
(
@id int
)
Begin
select id, description, date, ....
from yourtablename
where id = @id
End
当用户执行按钮单击或点击超链接时,您应该在运行时在应用程序中拥有该doc id。使用该ID调用上述SP。这部分是特定于平台的。所以,让我知道你的前端平台是什么,我们可以看看是否需要调整。