【问题标题】:Refining Search Results [PHP/MySQL]优化搜索结果 [PHP/MySQL]
【发布时间】:2010-03-19 02:07:16
【问题描述】:

我正在创建一组搜索窗格,允许用户在提交查询后调整他们的结果集。我们从结果中提取某些字段中常见的值,并按照它们的受欢迎程度来显示它们——你们都在 eBay 上看到过这种事情。因此,如果我们的结果中有很多行是在 2009 年创建的,我们将能够单击“2009”并仅查看该年创建的行。

您认为应用这些过滤器最有效的方法是什么?我的工作解决方案是从结果中丢弃与额外参数不匹配的条目,例如:

while($row = mysql_fetch_assoc($query)) {
    foreach($_GET as $key => $val) {
        if($val !== $row[$key]) {
            continue 2;
        }
    }
    // Output...
}

这种方法应该只查询一次有效的数据库,因为添加过滤器不会改变查询 - MySQL 可以缓存和重用一个数据集。不利的一面是,它使分页有点让人头疼。

显而易见的替代方法是在初始查询中构建任何附加条件,例如:

$sql = "SELECT * FROM tbl MATCH (title, description) AGAINST ('$search_term')";
foreach($_GET as $key => $var) {
    $sql .= " AND ".$key." = ".$var;
}

有充分的理由这样做吗?还是有更好的选择?也许是一个临时表?任何想法都非常感谢!

【问题讨论】:

  • 我正在使用一个类似的系统,所有条件都进入第一个查询......即任何可能不是初始查询一部分的过滤器都在同一段代码中,并在动态构建查询时得到处理(或不处理)。正如您所说,使分页更容易并将内容保存在一个地方。
  • 谢谢汤姆!如果它是现场的,我很想看看......

标签: php mysql search


【解决方案1】:

我会继续重新查询数据库,以将所有内容放在一起并减少分页噩梦。

你是通过 AJAX 做的吗?

【讨论】:

  • 感谢您的回复。理想情况下,我更喜欢使用 AJAX 的系统,但目前它需要刷新页面。
【解决方案2】:

是否使用Memory Storage Engine 选项?

如果您正在执行大量查询(我的意思是很大),使用内存存储引擎可以节省时间。 (虽然金额不大)

【讨论】:

  • 有趣的建议。在像我这样小的手术中可能会矫枉过正,但它可以工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多