繁体   English   中英

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

[英]How to filter by multiple fields in MySQL/PHP

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

似乎会有很多if语句。 有没有更直观的方式来实现这一目标?

谢谢!

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

除非您有特殊原因需要在应用程序本身中完成排序,否则在其中放置一个ORDER BY子句。


编辑:现在您说要过滤数据。 我仍然会在数据库级别执行此操作。 向PHP发送巨大的数据集是没有意义的,只是PHP必须经过它并在那里过滤数据。 在大多数情况下,在MySQL中执行此操作将比在PHP中构建效率高得多。

由于大约有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或任何其他适用的数据库特定的字符串转义函数的缩写
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;

这可以帮助您实现目标。

不能。在对集合进行排序时,您无法避免测试操作,因为您必须以相同的方式比较集合中的元素。 这样做的载体是if语句。

你能看看这个吗?

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语句批处理,而且很冗长,但是您认为呢?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM