我正在为应用程序编写一个过滤器/排序功能,它将在每列上方显示文本字段。当用户在每个字段中键入时,请求将被发送到后端进行排序。由于将会有大约6个文本字段,我想知道是否有更好的排序方法,而不是使用if语句检查每个变量,如果输入所有字段,只写一个,或只是两个字段,编写特定查询等等。
好像会有很多if语句。是否有更直观的方法来实现这一目标?
谢谢!
答案 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";
用户填写查询的唯一字段。
排序方式将完全相同。