基于搜索结果的上一个/下一个记录

时间:2012-10-01 15:06:42

标签: php postgresql pagination paging

一些背景

该系统有大约一万条记录,允许用户浏览或搜索不同搜索条件的“大量”数组。然后,结果显示在一个分页表中,范围从几页到数据库中的每个结果。

如果用户进行了大量过滤并最终得到了结果并点击了任意记录,那么她就会被带到新视图/edit/{record_id},在那里她可以查看所述记录的所有详细信息。您可以随时返回上一个搜索结果,因为条件会保留在搜索栏中,但是:

我想要实现的目标

如果用户要根据搜索结果进行大量更改,那么使用上一个和下一个按钮可以非常方便访问相邻记录而不返回结果。

我已经能够使用id s

在基本级别上执行此操作
SELECT table.*, pn.p as previous_question, pn.n as next_question
   from table,
   (
       SELECT id, lead(id) OVER w as n, lag(id) OVER w as p
       FROM table
       window w as (order by id $order)
   ) as pn
   where table.id = $id
       and pn.id = $id

这显然仅适用于记录与数据库中的记录顺序最简单的情况。我想要的是让他们在数据顺序的每个案例中工作。不用说,几乎无限的方式来排序这些数据。

我一直在想什么

创建某种功能/工具,让我可以将SQL从搜索中保留下来并像上面那样再次执行,只有搜索条件和偏移量代替id s < / p>

保存结果中所有记录顺序的列表,可以在$_SESSION,数据库或其他地方,然后只需遍历列表即可获得{{1我需要的。

手头的工具

PHP,PostgreSQL,JS / jQuery。

TL; DR

无论用户点击“下一次”多少次,我都希望能够转到下一个搜索结果而无需返回搜索。

----------

任何输入都将不胜感激。相关文章的链接,接近这个甚至整个shebang的方法;)。能够在不吃掉所有服务器内存或过多的数据库访问的情况下解决这个问题也很好,尽管这里的资源并不是真正的问题。

4 个答案:

答案 0 :(得分:2)

我只是想把它扔出去......你应该使用 Solr 或类似的东西,特别是如果这是SAS并且暴露给很多用户。

基本上尝试跟踪分页搜索结果,然后遍历将导致应用程序中出现大量状态管理。

Solr(或者甚至只是简单的postgres)的想法是为搜索做一个开始和大小(又名 OFFSET LIMIT )。 Solr这么快就完成了它的性能问题。只需确保Solr或Postgres你做一个可预测的排序(又名 ORDER BY )。

如果您担心添加的新项目会丢弃分页,只需:WHERE create time stamp is less than when we did the initial search

答案 1 :(得分:0)

我在这里看到一堆可能的问题。最重要的是您正在尝试将无状态HTTP请求映射到有状态数据库操作,并且您尝试尽可能无状态地执行此操作。

我认为优雅的REST解决方案是使用导航按钮(back esp)和向下钻取来获取特定的详细记录。通过这种方式,您可以在客户端中保留基本结果,即浏览器缓存。

通过这种方式,您必须使用后退按钮返回(可能是分页的)摘要搜索结果,但您无需返回以达到搜索条件。

答案 2 :(得分:0)

存储搜索上下文,包括选定的过滤器,查询和排序顺序。 (可选)按内容对它们进行哈希处理,以便最终获得唯一的搜索上下文列表。

使用某种哈希值在详细信息页面的链接中包含指向已保存搜索上下文的链接。

在详细信息页面上,通过哈希检索搜索上下文并进行另外两次搜索,一次向前往同一方向,另一次向后搜索。通过在排序顺序定义中交换asc和desc来完成此操作。

在这两种情况下,将结果限制为1条记录,并添加一个附加条款,以确保不包含当前详细记录。

这应该为您提供上一个和下一个链接的正确记录。

可以在此处找到有关Elasticsearch的更详细答案:https://stackoverflow.com/a/42384125/401467

答案 3 :(得分:-1)

这个问题没有那么多解决方案。

1 - 因为您的查询是动态构建的,所以每次提供LIMIT ... OFFSET或直接使用result_id(使用WITH子句中的row_number窗口函数)时,您必须持久化标准并执行查询。

2 - 您可以直接在服务器中保留结果集,我不建议使用会话来存储这样的数据量。

3 - 或者您可以将Collection保留在客户端上,在Json中发送整个结果集并使用类似angularjs或backbonejs的Javascript进行浏览。我想如果你返回10k行,这也会很慢。

我建议1或3.

相关问题