sql where拼接技巧

1.将where语句从分支移到主干,解决where在分支上的多种情况,分支条件只需and 连接即可如where1==1等

$sql="SELECT * FROM bb where true ";

因为使用添加了“1=1”的过滤条件以后数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(也就是全表扫描)以比较此行是否满足过滤条件,当表中数据量比较大的时候查询速度会非常慢。优化方法

test.html

Java代码   收藏代码
  1. <td>商品名称:</td>  
  2. <td width="200"><input type="text" class="text" name="kit_name" id="fn_kit_name"/></td>  
  3. <td align="right">备案开始日期:</td>  
  4. <td width="200"><input type="text" name="search[or_get_reg_date]"/><img src="images/data.jpg" /></td>  
  5. <td>备案结束日期:</td>  
  6. <td width="200"><input type="text" name="search[lt_reg_date]"/><img src="images/data.jpg" /></td>  
  7. </tr>  
  8. <tr>  
  9.     <td>产品经理:</td>  
  10.     <td><input type="text" class="text" name="search[managerid]"/></td>  
Java代码   收藏代码
  1. <?php  
  2. $postData = array(  
  3.     'managerid' => '21',  
  4.     'or_get_reg_date' => '09',  
  5.     'lt_reg_date' => '2012-12-19',  
  6.     'in_id' => array(123),  
  7. );  
  8. $tmpConditions = transArrayTerms($postData);  
  9. echo $whereCause = getWhereSql($tmpConditions);  
  10. // WHERE managerid like '21%' OR reg_date<'09' AND reg_date>'2012-12-19' AND id in ('1','2','3')  

处理where条件的sql

Java代码   收藏代码
  1. <?php  
  2. /** 
  3.  * 表单提交值转化成where拼接数组 
  4.  */  
  5. function transArrayTerms($infoSearch) {  
  6.     $aryRst = array();  
  7.     $separator = array('lt'=>'<''let'=>'<=''gt'=>'>''get'=>'>=''eq'=>'=''neq'=>'<>');  
  8.     foreach ($infoSearch as $term => $value) {  
  9.         if (empty($value)) continue;  
  10.   
  11.         $name = $term;  
  12.         if (strpos($term, "or_") !== false) { //添加or连接符  
  13.             $terms['useOr'] = true;  
  14.             $name = str_replace("or_""", $term);  
  15.         }  
  16.   
  17.         if (strpos($name, "in_") !== false) {  
  18.             $terms['name'] = str_replace("in_""", $name);  
  19.             $terms['charCal'] = " in ";  
  20.             $terms['value'] = "('" . implode("','", $value) . "')";  
  21.         } else {  
  22.             $terms['name'] = $name;  
  23.             $terms['charCal'] = " like ";  
  24.             $terms['value'] = "'" . trim($value) . "%'";  
  25.         }  
  26.         //放在else后面  
  27.         foreach($separator as $charCalName =>$charCalVal){  
  28.             if (strpos($name, $charCalName."_") !== false) {  
  29.                 $terms['name'] = str_replace($charCalName."_""", $name);  
  30.                 $terms['charCal'] = $charCalVal;  
  31.                 $terms['value'] = "'" . trim($value) . "'";  
  32.             }  
  33.         }  
  34.         $aryRst[] = $terms;  
  35.         unset($terms);  
  36.     }  
  37.     return $aryRst;  
  38. }  
  39.   
  40. function whereOperator($has_where, $useOr) {  
  41.     $operator = $has_where ? ($useOr === false ? ' AND ' : ' OR ') : ' WHERE ';  
  42.     return $operator;  
  43. }  
  44.   
  45. /** 
  46.  * aryTerm transArrayTerms转化后的查询条件 
  47.  * @过滤没有输入的sql查询条件并转化成where条件. 
  48.  */  
  49. function getWhereSql($aryTerm) {  
  50.     $whereCause = '';  
  51.     if (count($aryTerm) > 0) {  
  52.         $has_where = '';  
  53.         foreach ($aryTerm as $value) {  
  54.             $has_where = whereOperator($has_where, isset($value['useOr']));  
  55.             $whereCause .= $has_where . $value['name'] . $value['charCal'] . $value['value'];  
  56.         }  
  57.     }  
  58.     return $whereCause;  
  59. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值