2012-04-08 90 views
0

我试图生成从那里名字的姓的任意组合相匹配的特定搜索字词Zend Framework的SQL SELECT查询建设(WHERE子句)

$select = $select->where('last_name LIKE ?', '%'.$term.'%')->orWhere('first_name LIKE ?', '%'.$term.'%') 
         ->orWhere("CONCAT(first_name,' ', last_name) LIKE ?", '%'.$term.'%') 
         ->orWhere("CONCAT(last_name,' ', first_name) LIKE ?", '%'.$term.'%');       

有一个用户表中选择的所有查询就是有也必须满足它在另一个where子句

$select = $select->where("deleted = 0 AND scholar = 0"); 

下面的SQL语句生成

SELECT `user`.* FROM `user` WHERE (last_name LIKE '%frank%') OR (first_name LIKE '%frank%') OR (CONCAT(first_name,' ', last_name) LIKE '%frank%') OR (CONCAT(last_name,' ', first_name) LIKE '%frank%') AND (deleted = 0 AND scholar = 0) ORDER BY `date_created` desc LIMIT 25 
规定的其他条件

这不会返回所需的结果,因为我得到的行在哪里scholar = 1;

我想通查询应该是

SELECT `user`.* FROM `user` WHERE ((last_name LIKE '%frank%') OR (first_name LIKE '%frank%') OR (CONCAT(first_name,' ', last_name) LIKE '%frank%') OR (CONCAT(last_name,' ', first_name) LIKE '%frank%')) AND (deleted = 0 AND scholar = 0) ORDER BY `date_created` DESC LIMIT 25 

什么是正确的语法使用$选择对象实现这一目标。

回答

3

您可以使用quoteInto准备你的条件,然后使用它们像这样:

$first_name_cond = $db->quoteInto('first_name LIKE ?', '%'.$term.'%'); 
    $last_name_cond = $db->quoteInto('last_name LIKE ?', '%'.$term.'%'); 

    $concat_cond1 = $db->quoteInto("CONCAT(first_name,' ', last_name) LIKE ?", '%'.$term.'%'); 

    $concat_cond2 = $db->quoteInto("CONCAT(last_name,' ', first_name) LIKE ?", '%'.$term.'%'); 


    $select = $select->where($first_name_cond.' OR '.$last_name_cond.' OR '. 

      $concat_cond1.' OR '.$concat_cond2)->where("deleted = 0 AND scholar = 0"); 
0

我认为删除学者是单独的列。所以,最简单的方法是刚刚突破:

$select = $select->where("deleted = 0 AND scholar = 0"); 

成两个语句,如:

$select->where("deleted = ?", 0); 
$select->where("scholar = ?", 0); 

这种变化应该导致像SQL字符串:

SELECT `user`.* FROM `user` WHERE (last_name LIKE '%frank%') 
OR (first_name LIKE '%frank%') 
OR (CONCAT(first_name,' ', last_name) LIKE '%frank%') 
OR (CONCAT(last_name,' ', first_name) LIKE '%frank%') 
AND deleted = 0 AND scholar = 0 ORDER BY `date_created` desc LIMIT 25 

也删除多余的$select =。您的整个选择应该类似于:

//first line initializes the select object 
//The select object will handle most quoting needs for you 

$select = $this->select(); 

//I like to add expressions this way just to keep things easy to read and easy to edit 
//you can string multiple statements together, but I find that harder to edit. 

$select->where('last_name LIKE ?', '%'.$term.'%'); 
$select->orWhere('first_name LIKE ?', '%'.$term.'%'); 
$select->orWhere("CONCAT(first_name,' ', last_name) LIKE ?", '%'.$term.'%'); 
$select->orWhere("CONCAT(last_name,' ', first_name) LIKE ?", '%'.$term.'%'); 
$select->where("deleted = ?", 0); 
$select->where("scholar = ?", 0); 
$select->order('date_created DESC'); 
$select->limit(25); 
0
$user = new Application_Model_DbTable_User(); 
      // User List 

$uname=$_POST['uname']; 

echo $query = $user->select()->where('firstname LIKE ?', $uname.'%')->ORwhere('lastname LIKE ?', $_POST['lname'].'%')->ORwhere('emailid LIKE ?', $_POST['email'].'%'); 

$userlist = $user->fetchAll($query);