【发布时间】: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;
}
有充分的理由这样做吗?还是有更好的选择?也许是一个临时表?任何想法都非常感谢!
【问题讨论】:
-
我正在使用一个类似的系统,所有条件都进入第一个查询......即任何可能不是初始查询一部分的过滤器都在同一段代码中,并在动态构建查询时得到处理(或不处理)。正如您所说,使分页更容易并将内容保存在一个地方。
-
谢谢汤姆!如果它是现场的,我很想看看......