【发布时间】:2023-03-25 06:59:01
【问题描述】:
我正在创建一个基于 Web 的小型工具,允许用户以各种方式查询大型查找表。由于它是一个小工具,我使用的是 JSP/Servlets。
查找表有一个类似这样的定义:
第 1 列 |第 2 列 |第 3 列 |日期 |用户 |数
用户可以按列值或范围查询。此外,结果可以按特定列排序。因为该表有几十万条记录,并且增长迅速,所以我使用 Oracle 的 ROWNUM 并且只返回一小部分结果。
我有一个从用户那里获取搜索条件的表单页面。我根据一系列条件生成查询,例如:
query = "SELECT * FROM mytable WHERE 1=1 "
if(searchCriteria1 != "")
query += "AND column1='searchCriteria1' "
if(searchCriteria2 != "")
query += "AND column2='searchCriteria2' "
if(searchCriteria2 != "")
query += "AND column2='searchCriteria2' "
if(searchCriteria3 != "")
query += "AND column3='searchCriteria3' "
if((searchCriteria4 != "") && (searchCriteria5 != ""))
query += "AND date>='searchCriteria4' AND date<='searchCriteria5' "
etc...
(这只是简化的伪代码)
在显示第一个结果页面后处理排序。用户单击该页面的列标题以按该列排序。这将是回发并查询数据库。基本上,我在上面运行相同的代码,但最后是这样的:
if(sortColumn1)
query += "ORDER BY column1"
if(sortColumn2)
query += "ORDER BY column2"
if(sortColumn3)
query += "ORDER BY column3"
因此,正如您想象的那样,我的查询构建代码非常长,包含所有这些不同的条件。有什么更好的方法建议吗?
【问题讨论】:
-
为什么不能在客户端使用 jquery 进行排序?或任何其他 js 插件
-
首先,我认为您不需要返回符合条件的所有内容,您只需返回前100名甚至更少。其次,是否可以将大查找表拆分为几个小表,因为我认为对于某些列,它们被搜索的机会比其他列高得多,通过将它们拆分并稍后在适当的时间将它们重新连接在一起可以提高性能。第三,我认为您不必在服务器端进行所有排序。