代码如下: 需要根据不同的搜索条件进行过滤,结果需要分页。
         $major = trim($_GET["major"]);
$area = trim($_GET["area"]);
$tel = trim($_GET["tel"]);
$contactor = trim($_GET["contactor"]);
$cpname = trim($_GET["cpname"]);
if($major!=""){
$query.=' and (major like "%'.$major.'%")';
}
if($area!=""){
$query.=' and (area like "%'.$area.'%")';
}
if($cpname!=""){
$query.=' and (company_name like "%'.$cpname.'%")';
}
if($tel!=""){
$query.=' and (telphone="'.$tel.'")';
}
if($contactor!=""){
$query.=' and (contactor="'.$contactor.'")';
}

    $sql = 'SELECT count(1) as cnt FROM company WHERE 1=1 '; 
    $sql.= $query;    $cnt = $GLOBALS['db']->getOne($sql);

    $sql = 'SELECT company_name,url,address FROM company WHERE 1=1 '; 
    $sql.= $query;
    $sql.= ' limit '.(($page-1) * $size).",".$size;
    
    $res = $GLOBALS['db']->getAll($sql);
    $arr = array();
    foreach ($res AS $idx => $row)
    {
$arr[$idx]['title']       = str_replace($major,("<font color=\"#CC0033\">".$major."</font>"),$row['company_name']);
$arr[$idx]['title']       = str_replace($area,("<font color=\"#CC0033\">".$area."</font>"),$arr[$idx]['title']);
$arr[$idx]['title']       = str_replace($cpname,("<font color=\"#CC0033\">".$cpname."</font>"),$arr[$idx]['title']);
$arr[$idx]['company_name']       = $row['company_name'];
$arr[$idx]['url']         = $row['url'];
$arr[$idx]['address']     = str_replace($area,("<font color=\"#CC0033\">".$area."</font>"),$row['address']);
    }

解决方案 »

  1.   

    这是你PHP上根据用户输入来生成不同的SELECT 语句的 WHERE 部分。一般是用多个判断 来实现。
      

  2.   


    $sql = 'SELECT count(1) as cnt FROM company WHERE 1=1 '; 
        $sql.= $query;     $cnt = $GLOBALS['db']->getOne($sql);     $sql = 'SELECT company_name,url,address FROM company WHERE 1=1 '; 
        $sql.= $query; 
        $sql.= ' limit '.(($page-1) * $size).",".$size; 整个页面有二个查询,第一个是统计所有条数的吧。不知道 count(1)是什么意思?
    $sql = 'SELECT count(*) as cnt FROM company WHERE 1=1 '; 
    整个条件查询是用  like 实现的, 感觉是导致查询慢的主要原因。可以考虑将部分查询条件设置成 固定选择性的,然后查询语句可以少用一点 like 了 
      

  3.   

    为什么大家都不仔细看代码呢。if($major!=""){
    $query.=' and (major like "%'.$major.'%")';
    }
    if($area!=""){
    $query.=' and (area like "%'.$area.'%")';
    }
    if($cpname!=""){
    $query.=' and (company_name like "%'.$cpname.'%")';
    }
    if($tel!=""){
    $query.=' and (telphone="'.$tel.'")';
    }
    if($contactor!=""){
    $query.=' and (contactor="'.$contactor.'")';

      

  4.   

    Mysql的like查询是低效的,特别是 %在开头的情况(完全无法利用索引)。 建议:
    1. 缓存查询结果
    2. 使用第三方搜索工具,如sphinx
      

  5.   

    like %%这样的查询是很慢的,何况你的数据超过200W。可以按LS的方法
      

  6.   

    贴出最终你认为慢的sql,explian信息贴出来。
      

  7.   


    id  select_type  table         type  possible_keys  key  key_len  ref  rows     Extra  
    1   SIMPLE       company   ALL          NULL        NULL  NULL   NULL  2383828  Using where 
      

  8.   

    type -> ALL 全表扫描
    key-> NULL 未用到任何索引你的语句是什么?考虑给相关列建立索引,使用like 'something%'这样的语句,而不是like '%something%'
      

  9.   


    id  select_type  table         type  possible_keys  key  key_len  ref  rows     Extra  
    1   SIMPLE       company   ALL          NULL        NULL  NULL   NULL  2383828  Using where 
      

  10.   

    ???
    你explian的什么样的sql语句?
    未使用到任何索引而整表扫描,除了要建相关索引外,还要注意语句可以有效使用建立好的索引进行搜索。