【问题标题】:Filter database results without running an additional query在不运行其他查询的情况下过滤数据库结果
【发布时间】:2010-10-15 16:55:59
【问题描述】:

我正在将 CodeIgniter 用于分类广告网站。这是我想要实现的具体示例:

在页面http://www.example.com/browse/Real-Estate 上列出了所有房地产分类。我正在使用 CI 的分页类对结果进行分页。

在左侧栏中,显示了一组过滤器,它们对应于“房地产分类”表的每个 db 列。例如:

类型:独立屋、公寓 卧室:1,2,3,4... 带家具:是,否 等等

每次用户选择一个值时,都会运行一个查询并使用 Ajax 更新结果。

但是,由于值的选择对应于初始查询中的附加“WHERE”子句,我想知道在不重新运行的情况下过滤已经可用结果的最佳方法是什么查询。

【问题讨论】:

    标签: database codeigniter filter


    【解决方案1】:

    您为什么反对运行额外的查询?如果用户从没有过滤器的广泛查询开始,过滤它意味着遍历结果集并对每一行执行过滤器检查。如果用户从带有过滤器的窄查询开始,更改或删除过滤器无论如何都需要一个新的查询,而添加过滤器则需要对结果集进行迭代。

    如果我是你,我会构建一个适用于所有条件的过滤器系统,将信息发送到服务器以构建查询,构建一个包含查询结果的视图,并将 HTML 作为字符串返回给浏览器,您可以在其中使用 jQuery(或其他)将其插入结果框中。这样做可以为您节省最多的时间,让您编写最少的 Javascript,并且,我认为,使您的应用程序看起来非常敏捷(而不是使用 Javascript 来迭代大型结果集)。

    【讨论】:

    • 其实你所描述的正是我现在所拥有的。我应该说初始查询始终是 SELECT * FROM TABLE LIMIT 20,然后用户缩小结果范围。一个想法是将查询缓存到文件中,并在构建 html 视图时,将过滤器的值注入每个结果的类中,例如
      。然后在过滤时,使用 jQuery 选择器隐藏不匹配的结果。
    • 这是可能的。如果您将某些元素称为“公寓”或添加新过滤器,那么玩这样的类可能会让您头疼。尽管如此,您说您将查询结果限制为 20 个,所以当添加过滤器时,您只想对这 20 个结果运行过滤器?您将如何填写列表的其余部分?看起来......你会增加比你需要的更多的头痛,除非你真的在服务器上有非常严重的 CPU 限制。
    • 我的意思是:每小时运行一个 cron 作业,查询“SELECT * FROM table”(无限制)并缓存结果 div 框。在“浏览”页面上,jQuery 处理分页。过滤时,jQuery 会隐藏不相关的结果并重新排列列表以填满页面。但很可能你是对的,我正在为性能的小幅提升增加更多的麻烦。
    • 啊有趣。是的,我想这是一种可能性,但是您必须担心数据更改时会发生什么。如果您有持久数据,这将非常有效,但如果您看到任何更改,事情可能会开始变得不稳定。嗯,我只想说,我不是数据库专家,所以我的建议可能不是最好的。不过,我会选择对你来说最简单的方法。当它们成为问题时,开始担心次要的性能问题。
    【解决方案2】:

    基本上一开始你就可以把所有的结果通过-

    select * from TABLE
    

    然后,当用户选择任何特定条件时,您可以使用ajax 发布该条件。

    ajax 将调用控制器函数 -

    function update_criteria(){
    //Here you can call an another function say aply_criteria as follows.
    
    array_walk('your actual result array','apply_criteria');
    
    //finally parse the html with new filtered result throuh ajax.
    
     echo $this->parser->parse('view_name','data array',TRUE);
    
    //catch the above html in the sucess callback function of ajax and replace it in the 
    //previous html page.
    
    Note :- the parser i have used above is an library in an codigniter so make sure you load it before using.
    
    }
    
    function apply_criteria(){
    
    //Actual logic to unset the specific key value pair 
    //(which does not satisfy the  criteria depending on the post data) from array.
    
    }
    

    array_walk 文档 - http://www.php.net/manual/en/function.array-walk.php

    【讨论】:

    • 上面我没明白 update_criteria() 是从哪里得到结果数组的?我的意思是在这一行:array_walk('your actual result array','apply_criteria');
    • 最初,当您获得所有结果时,您必须将该结果保存在会话中,并且每次都必须从会话中获取该结果。但不要将过滤后的结果保存在会话中。
    • 这是个好主意。但是存储在会话中不是一种选择,因为数组的大小可能高达 8000 x 12。这可能会导致性能问题。我想我坚持使用“重新查询”解决方案。我会看看它是怎么回事,也许试试你的解决方案,也许缓存初始查询结果而不是将它们存储在会话中。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签