多个条件进行筛选查询的时候,怎么设计比较好?

Forsend 发布于 2014/10/09 11:28
阅读 4K+
收藏 1

php,pdo方式,没用任何框架。这是前提条件,不可改变

比如,现在只有一张学生表student,包含了所有学生相关信息(id,学号,姓名,班级。。。)。

比如班级筛选,我可以选1班,2班,3班,或者选“任何班级”。

类似这样的筛选条件,非常多

如果班级参数是”任何班级”,语句就是select * from student;不是“任何班级”,语句就是select * from student where class = ?。

关键是这样的筛选条件实在是太多了,每一个筛选条件都有“任何”这样一个选项。还有很多筛选选项是类似年龄10-20这样的范围,还有的是类似名字包含“飞”,就是like “%飞%”这样的形式。

如果我针对这么多筛选项一个个判断,那要写太多的判断代码,可能出现的sql语句形式也太多了,难道我要针对所有出现的情况去执行不同的sql语句吗?

请问有什么好的方法可以解决类似的问题吗,求解答。大胆 @红薯 一下。

加载中
0
zephor
zephor

最后不是执行不同的sql是什么?查的东西不一样。

但是不同的sql一定是写出来的么,分查询条件类别凑sql就行了

$query_arr = array(
    'class' => '',  //这里的值分为空(表示任何)、string(表示某一)、array(表示多选)
    'name' => ''  // 同上
);
$sql = 'select * from student where ';
foreach($query_arr as $k => $v){
    // 在这里判断类型 凑sql
}



Forsend
Forsend
谢谢。 如果筛选条件少还好,主要就是太多了。如果都做判断的话,就要写一大堆的判断和sql拼接。
0
大飞哥没翅膀
大飞哥没翅膀

不管任何条件,只管and条件

0
wx---每日佳选
wx---每日佳选
不要怕麻烦..
wx---每日佳选
wx---每日佳选
回复 @Forsend : 可以试试以数组的形式传回服务器,然后循环处理.
Forsend
Forsend
也不是怕麻烦了。希望有更好的方式,不知道主流框架是怎么处理这种需求的。
0
Cobbage
Cobbage

责任链 过滤

0
千斤难买春秋醉
千斤难买春秋醉

这些肯定都是and

然后select * from xxx where 1=1

后面写循环判断参数是否为空或者任何,来决定拼接and xxx =xxx

0
达不溜H
达不溜H
你可以做下分类,先确定你要查多少张表,这些表中需要用来筛选的字段有没有相近的,相近的可抽出来一起处理,不同的再单独处理,动态的地方也就是表明和表中的字段不一样,这些地方用参数做下判断,进行替换就行。再就是where 1=1没有条件默认查所有。
0
Nick_路
Nick_路

给卤煮推荐一个解决方案, 不过可能对表结构变动较大. 

可以通过添加一列,作为搜索专用列的方式解决(暂时叫他 filter).
filter中存放 concat()所需检索的所有列的数据, 冗余在这一列中.
搜索时,只要过滤filter一列即刻. 

如果数据量较大, 以全文索引的方式过滤fiter, 可以达到很高的效率. 
如果数据量不大(万行以内) 可以考虑用like.

这样, 既解决了n个like的问题, 又可以通过全文检索提高检索效率.

update student t 
set t.filter = concat(id , ' - ' , name  , ' - ' , age );

select id , name , age 
from student
where filter like '%张三%';


对于大量过滤条件的情况下, 可以使用全文索引, 只要将各种条件在页面拼接为一个字符串, 并以空格分割(如 "张三 18" ), 在语句中直接在filter 字段中过滤即可. 

 
Nick_路
Nick_路
回复 @小99 : 修改.. 可以通过触发器实现,程序代码不受影响.. 对于两个字段内容相同.. 确实比较无力..
小99
小99
我感觉这样有两个小问题,一时每次修改这条数据都要同时修改这个字段的值确保一致;二是如果主键是自增(比如自增到14了),你想查年龄是14的,使用like会出现两条
Forsend
Forsend
谢谢,你的思路不错,我会借鉴的。
返回顶部
顶部