通过引用主键

时间:2016-06-29 21:30:11

标签: mysql

我有一个表"文档",有一个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

1 个答案:

答案 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。这部分是特定于平台的。所以,让我知道你的前端平台是什么,我们可以看看是否需要调整。