如何在MySQL / PHP中按多个字段过滤

时间:2011-11-14 15:25:14

标签: php mysql sorting

我正在为应用程序编写一个过滤器/排序功能,它将在每列上方显示文本字段。当用户在每个字段中键入时,请求将被发送到后端进行排序。由于将会有大约6个文本字段,我想知道是否有更好的排序方法,而不是使用if语句检查每个变量,如果输入所有字段,只写一个,或只是两个字段,编写特定查询等等。

好像会有很多if语句。是否有更直观的方法来实现这一目标?

谢谢!

5 个答案:

答案 0 :(得分:3)

任何初始数据操作(例如排序)通常由数据库引擎完成。

在那里放一个ORDER BY子句,除非你有特定的理由在应用程序本身完成排序。


修改:您现在要说的是要过滤数据。我仍然会在数据库级别执行此操作。向PHP发送一个庞大的数据集是没有意义的,只是因为PHP必须通过它并过滤掉那里的数据。在大多数情况下,在MySQL中执行此操作将比在PHP中构建的更有效。

答案 1 :(得分:0)

select * from Users

order by Creadted desc, Name asc, LastName desc, Status asc

您的记录将按查询顺序排序。

首先通过Created desc,然后通过Name asc等等。

但是根据您的问题,我可以看到您正在搜索过滤结果。

因此,要按多个文件进行过滤,只需将您的位置附加到其中,或者如果您正在使用任何ORM,则可以通过对象方法执行此操作。

但如果它很简单就可以这样做

$query = "";
foreach($_POST['grid_fields'] as $key => $value)
{
   if(strlen($query) > 0)
         $query .= ' and '
   $query .= sprintf(" %s LIKE '%s' ", mysql_real_escape_string($key), '%' .mysql_real_escape_string($value) .'%');  
}
if(strlen($query) > 0)
   $original_query .= ' where ' . $query;

这可以帮助您实现结果。

答案 2 :(得分:0)

没有。排序集时无法避免测试操作,因为您必须以相同的方式比较集合中的元素。这方面的工具是if语句。

答案 3 :(得分:0)

你能看看这个吗?

WHERE (ifnull(@filter1, 1) = 1 or columnFilter1 = @filter1)
  and (ifnull(@filter2, 1) = 1 or columnFilter2 = @filter2)
  and (ifnull(@filter3, 1) = 1 or columnFilter3 = @filter3)
  and (ifnull(@filter4, 1) = 1 or columnFilter4 = @filter4)
  and (ifnull(@filter5, 1) = 1 or columnFilter5 = @filter5)
  and (ifnull(@filter6, 1) = 1 or columnFilter6 = @filter6)

如果我误解了你的问题,请告诉我。它不像IF声明批,而且相当冗长,但你怎么看?

答案 4 :(得分:0)

  

由于将会有大约6个文本字段,我想知道是否有更好的排序方法,而不是使用if语句来检查每个变量

肯定没有。

首先,按顺序使用几个if是没有错的 相信我 - 我自己是减少重复代码的忠实粉丝,但认为这些手动编写的块是最好的解决方案 接下来,虽然可以有一种方法将这些条件包裹起来,但是大多数情况下不同的条件需要不同的处理。

然而,在你的下一个陈述中你错了:

  

并撰写特定查询

您只需要一个查询

  

似乎会有很多if语句。

为什么呢?不超过你拥有的领域数量。

这里是自定义搜索查询构建代码的完整示例:

$w     = array();
$where = '';

if (!empty($_GET['rooms']))     $w[]="rooms='".mesc($_GET['rooms'])."'";
if (!empty($_GET['space']))     $w[]="space='".mesc($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mesc($_GET['max_price'])."'";

if (count($w)) $where="WHERE ".implode(' AND ',$w);
$query="select * from table $where"; 

用户填写查询的唯一字段。

排序方式将完全相同。

  • mesc是mysql_real_escape_string的缩写或任何其他适用的特定于数据库的字符串转义函数