我想创建一些链接过滤器,用户可以使用这些过滤器来缩小数据库中的数据列表。
例如,我有5种过滤器类型:
用户可以一次性使用全部,部分或全部过滤器。
我的第一印象是我必须存储一个变量,我的WHERE子句的所有“AND”和“OR”都是一个接一个堆叠但是看起来很乏味,因为我可能需要以编程方式添加/删除一些过滤器类型后面。
有没有办法不使用我用一个巨大的请求过滤一次的整个mysql数据,而是链接我可以在必要时添加/撤销的目标请求?
我的意思是,我可以一个接一个地过滤每个先前过滤结果的结果吗?
例如,而不是这样做:
SELECT * FROM mytable WHERE (A=3 AND B=4 AND ((C>date1) OR (D<date2)) AND D LIKE '%sample%' )
是否有可能做出能够实现这一想法的事情:
request 1 = SELECT * FROM mytable WHERE A=3
request 2 = SELECT * FROM "result of request 1" WHERE B=4
request 3 = SELECT * FROM "result of request 2" WHERE C>date1 OR D<date2
request 4 = SELECT * FROM "result of request 3" WHERE E LIKE '%sample%'
如果过滤器意图随时间变化,则第一种方法很难管理,而第二种方法只是向链中添加/取出所需过滤器。 更不用说你拥有的过滤器越多,第一种方法就越难以理解和无法管理。
这可以在纯php中获得,如果我决定在检索整个mysql表后过滤数据但是看起来反效果而且更冗长,而Mysql我需要直接过滤数据而且看起来无用得到整个来自Mysql的数据,当我最后只需要它的一部分时。
感谢您的帮助。
答案 0 :(得分:0)
我更喜欢第一种情况,我假设您正在提交表单以决定要过滤的内容。我将它的可扩展性和易于阅读的方式,只是命名表单字段与数据库字段相同。然后,您可以保留包含要使用的字段的数组,也可以进行数据库调用以检查字段是否是您要在过滤器中使用的字段。一个简单的例子。
$filterFields = array('startDate'=>'>',
'endDate'=>'<',
'location'=>'=',
'keyword'=>'LIKE');
function buildQuery($filterFields, $mysqli)
{
$partCount = 0;
$query = "SELECT * FROM mytable WHERE ";
foreach($_POST as $key=>$value)
{
//is the field one we want to use? Does it contain a value?
if(in_array($key, array_keys($filterFields) && !empty($value))
{
if($partCount > 1)
$query .= ' AND ';
if($filterFields[$key] == 'LIKE')
$query .= " `".$key."` LIKE '%".mysqli->real_escape_string($value)."%' ";
else
$query .= " `".$key."` ".$filterFields[$key]." '".mysqli->real_escape_string($value)."' ";
++$partCount;
}
}
return $query;
}
希望这是有道理的。如果那不符合你的要求,或者你需要澄清,请告诉我。这也没有经过测试,只是在这里写下来。