2012-07-09 81 views
0

我正在使用codeigniter,我想在WHERE子句中使用IF條件。但它沒有正確執行。如何在WHERE子句中正確寫入IF條件codeigniter

$where_string="(a.FirstName LIKE '".$search_phrase."%' OR (IF(c.PrivacySettingElephantiUser=1,'a.LastName LIKE \'".$search_phrase."%\' OR CONCAT(a.FirstName, \' \', a.LastName) LIKE \'".$search_phrase."%\' ','')))"; 
$this->db->where($where_string); 

我在這裏做一個搜索。通過first namelast namefirst nameconcatlast name

我檢查值c.PrivacySettingsElephantiUser。如果只是這是真的,我爲姓和名字cheque的姓氏concat值,事情是如果c.PrivacySettingsElephantiUser=1c.PrivacySettingsElephantiUser=0,

這部分不執行。

OR (IF(c.PrivacySettingElephantiUser=1,'a.LastName LIKE \'".$search_phrase."%\' OR CONCAT(a.FirstName, \' \', a.LastName) LIKE \'".$search_phrase."%\' ','')

它僅由第一名稱搜索總是忽略if條件,

如何正確地寫這個?

有沒有一種簡單的方法來使用AND ,OR邏輯來做到這一點?

UPDATE

這是我的完整的查詢

public function search_people($profile_id,$search_phrase=NULL,$country=NULL,$state=NULL,$city=NULL,$neighborhood=NULL,$type=NULL,$limit=NULL,$offset=NULL) 
{ 
    $this->db->select('SQL_CALC_FOUND_ROWS a.ProfileID,a.FirstName,a.LastName,a.StateName,a.CityName,a.ShowLastName,a.UserType,a.ProfileImg,b.FriendStatus,b.RequesterID,b.AccepterID',FALSE); 
    $this->db->from($this->mastables['xxxxxxxx'].' as a'); 
$this->db->join($this->mastables['yyyyyyyyyyy'].' as b'," b.RequesterID=a.ProfileID AND b.AccepterID=".$profile_id." OR b.AccepterID=a.ProfileID AND b.RequesterID=".$profile_id,'left'); 


    $this->db->where('a.ProfileID !=',$profile_id); 
    $this->db->where('a.UserType',2); 

    if($type=="friend") 
    { 

     $this->db->join($this->mastables['profile_privacy_settings'].' as c'," c.EntityID=a.ProfileID AND c.UserType=2 AND c.ProfilePrivacySettingDefaultID=1 ",'inner'); 
     $where_string="(a.FirstName LIKE '".$search_phrase."%' OR (IF(c.PrivacySettingFriend=1,'a.LastName LIKE \'".$search_phrase."%\' OR CONCAT(a.FirstName, \' \', a.LastName) LIKE \'".$search_phrase."%\' ','')))"; 
     $this->db->where($where_string); 
     $this->db->where('b.FriendStatus',1); 
    } 
    else if($type=="other") 
    { 
     $this->db->join($this->mastables['profile_privacy_settings'].' as c'," c.EntityID=a.ProfileID AND c.UserType=2 AND c.ProfilePrivacySettingDefaultID=1 ",'inner'); 
     $where_string="(a.FirstName LIKE '".$search_phrase."%' OR (IF(c.PrivacySettingElephantiUser=1,'a.LastName LIKE \'".$search_phrase."%\' OR CONCAT(a.FirstName, \' \', a.LastName) LIKE \'".$search_phrase."%\' ','')))"; 
     $this->db->where($where_string); 
     $this->db->where ('(b.FriendStatus IS NULL OR b.FriendStatus=0)'); 
    } else {  
     $this->db->join($this->mastables['profile_privacy_settings'].' as c'," c.EntityID=a.ProfileID AND c.UserType=2 AND c.ProfilePrivacySettingDefaultID=1 ",'inner'); 
     $where_string="(a.FirstName LIKE '".$search_phrase."%' OR (IF(c.PrivacySettingElephantiUser=1 OR c.PrivacySettingFriend=1,'a.LastName LIKE \'".$search_phrase."%\' OR CONCAT(a.FirstName, \' \', a.LastName) LIKE \'".$search_phrase."%\'','')))"; 
     //$where_string="(a.FirstName LIKE '".$search_phrase."%' OR (IF(c.PrivacySettingElephantiUser=1 OR c.PrivacySettingFriend=1,'a.LastName LIKE b%','')))"; 
     $this->db->where($where_string); 
    } 

    if($country) 
    { 
     $this->db->where('a.CountryID',$country); 
    } 
    if($state) 
    { 
     $this->db->where('a.StateID',$state); 
    } 
    if($city) 
    { 
     $this->db->where('a.CityID',$city); 
    } 
    if($neighborhood) 
    { 
     //$this->db->where('',$neighborhood); 
    } 
    if($limit) 
    { 
     $this->db->limit($limit,$offset); 
    } 

$query = $this->db->get(); 
//echo $this->db->last_query();die; 
$result['result'] = $query->result_array(); 

$query = $this->db->query('SELECT FOUND_ROWS() AS `Count`'); 
    $result["totalrows"] = $query->row()->Count; 

if(!empty($result)) 
{ 
    return $result; 
} 
} 
+0

我想你可以」在if條件中使用'sql表達式',可能是因爲使用'CASE'而不是@manurajhada表示 – Junaid 2012-07-09 06:18:38

+0

@junaid請告訴我,怎麼樣,我試過,但給人錯誤 – 2012-07-09 06:21:45

+0

嘗試這個 - '$ where_string = 「(a.FirstName LIKE「」。$ SEARCH_PHRASE。「%'OR( \t CASE \t \t WHEN c.PrivacySettingElephantiUser = 1,則 \t \t \t 'a.LastName LIKE \' 「$ SEARCH_PHRASE。」 %\ 'OR \t \t \t \t CONCAT(a.FirstName,\' \ 'a.LastName)如\' 「$ SEARCH_PHRASE。」 %\」' \t \t \t \t ELSE '' \t \t \t \t)));; – Junaid 2012-07-09 07:04:08

回答

1

沒有得到PHP操作只是寫的SQL代碼..使用Case語句進行查詢哪裏

case when (c.PrivacySettingElephantiUser=1 AND (a.LastName LIKE '%something%' 
OR CONCAT(a.FirstName, \' \', a.LastName) like '%something%') then 1 else 0 end; 
+0

嗯,如何將這個應用到我的代碼中,我試過了\t \t \t $ where_string =「(a.FirstName LIKE'」。$ search_phrase。「%'OR(case(when.CustomersSettingElephantiUser = 1 AND(a.LastName LIKE'「。$ search_phrase。」%'OR CONCAT(a.FirstName,\'\',a.LastName)like'「。$ search_phrase。」%')then 1 else 0 end) ))「; 但它失敗 – 2012-07-09 06:18:38

+0

嘗試此操作.. '$ where_string =「(a.FirstName LIKE'」。$ search_phrase。「%'OR(case)(c.PrivacySettingElephantiUser = 1 AND(a.LastName LIKE'」。$ search_phrase。「%'OR CONCAT(a.FirstName,\'\',a.LastName)like'」。$ search_phrase。「%'))then 1 else 0 end))」;' – manurajhada 2012-07-09 06:26:06

+0

當CONCAT (a.FirstName,\'\',a.LastName)。非常感謝你 。 – 2012-07-09 07:19:59