我目前正在开发一个项目,该项目使用动态生成的LIKE
查询来匹配mysql DB中的结果。
某些搜索过滤器(例如“状态”)包含以下下拉列表:
<select name="status">
<option value="inactive">
...
此下拉列表的value
主要注入LIKE
语句并返回该过滤器的相应记录。问题是我需要添加all
选项,该选项将为每个过滤器返回所有记录(在这种情况下,所有状态,活动,非活动等)。
我的问题是,是否可以创建一个选项,例如:
<option value="*"> All </option>
将生成类似于以下查询的内容,并返回所有“状态”记录:
SELECT * FROM records WHERE status LIKE '%*%'
我的目标是不必为每个需要All
选项的过滤器硬编码额外的PHP条件。
答案 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')";
}