故意用LIKE子句返回所有记录

时间:2014-01-10 16:35:10

标签: mysql

我目前正在开发一个项目,该项目使用动态生成的LIKE查询来匹配mysql DB中的结果。

某些搜索过滤器(例如“状态”)包含以下下拉列表:

 <select name="status">
       <option value="inactive"> 
  ...

此下拉列表的value主要注入LIKE语句并返回该过滤器的相应记录。问题是我需要添加all选项,该选项将为每个过滤器返回所有记录(在这种情况下,所有状态,活动,非活动等)。

我的问题是,是否可以创建一个选项,例如:

<option value="*"> All </option>

将生成类似于以下查询的内容,并返回所有“状态”记录:

SELECT * FROM records WHERE status LIKE '%*%'

我的目标是不必为每个需要All选项的过滤器硬编码额外的PHP条件。

3 个答案:

答案 0 :(得分:3)

请勿在{{1​​}}

之间放置任何内容
%%

这是 SQLFiddle 演示


现在,重要的问题为什么您在处理预定义选项列表时使用SELECT * FROM records WHERE status LIKE '%%'; ^^ 停止!不要这样做。以这种方式使用LIKE可以防止MySQL使用您在此列上可能拥有的任何索引,从而在每次查询数据时有效地导致完整扫描。

答案 1 :(得分:1)

select 'abc' like "%%%" -- >1

<option value="%"> All </option>

答案 2 :(得分:0)

如果您不需要,我建议您使用可以将LIKE语句全部缩短在一起的条件来组织查询。

你可以在php中做这样的事情:

$query = "WHERE true ";

if($status != "all")
   $query .= " AND status LIKE '%".$status."%'";
if($some_other_filter != "all")
   $query .= " AND some_other_filter LIKE '%".$some_other_filter."%'";
// .. and so on

当然,就构建代码而言,您可以为所有过滤器使用关联数组,只需编写一个循环:

$query = "WHERE true ";    

foreach($filters_array as $filter => $value)
{
    if($value != "all")
       $query .= " AND $filter LIKE '%".$value."%'";
}

如果您不想将条件放在PHP中,您可以在SQL查询中进行短路:

foreach($filters_array as $filter => $value)
{        
    $query .= " AND ($filter LIKE '%".$value."%' OR $value = 'all')";
}