2013-01-22 39 views
1

我使用CodeIgniter的db類來創建查詢。多個WHERE在MySQL語句中給我帶來麻煩

查詢最終看起來像這樣;

SELECT `user_id`, `firstname`, `lastname`, `email`, `school_id`, `country_id` 
    FROM (`users`) 
    WHERE `user_id` != '1' 
    AND `firstname` = 'thomas' 
    OR `lastname` = 'thomas' 
    OR `email` = 'thomas' 
    OR `firstname` = 'jefferson' 
    OR `lastname` = 'jefferson' 
    OR `email` = 'jefferson' 

在這種情況下,用戶搜索「托馬斯·傑斐遜」和用戶自己的ID爲1。因此,要確保用戶無法搜索自己會檢查,以便user_id是不是1。

我知道查詢並不好,但它完全適用於什麼,我需要它,以及我是懶得做是正確的。

這一切背後的PHP代碼是

$this->db->select('user_id, firstname, lastname, email, school_id, country_id')->from('users'); 
    $this->db->where('user_id !=', $this->session->userdata('user_id')); 
    for ($i = 0; $i < count($searchQuery); $i++) { 
     if ($i == 0) { 
      $this->db->where('firstname', $searchQuery[$i])->or_where('lastname', $searchQuery[$i])->or_where('email', $searchQuery[$i]); 
     } else { 
      $this->db->or_where('firstname', $searchQuery[$i])->or_where('lastname', $searchQuery[$i])->or_where('email', $searchQuery[$i]); 
     } 
    } 
    $this->db->limit(10); 
    $query = $this->db->get(); 

我99%肯定的是,

WHERE `user_id` != '1' 
    AND(<-- this) `firstname` = ... 

是錯誤的,但我似乎無法找出一種不同的方式做它。

回答

1

以SQL Server中的看Operation Precedence
在那裏你會發現,AND操作之前OR操作評估。

這意味着您的查詢首先評估AND

user_id != '1' AND firstname = 'thomas'

然後

OR blablablablabla (the rest of the query)

爲了使它糾正它會只是這樣的:

SELECT `user_id`, `firstname`, `lastname`, `email`, `school_id`, `country_id` 
    FROM (`users`) 
    WHERE `user_id` != '1' 
    AND (`firstname` = 'thomas' 
    OR `lastname` = 'thomas' 
    OR `email` = 'thomas' 
    OR `firstname` = 'jefferson' 
    OR `lastname` = 'jefferson' 
    OR `email` = 'jefferson') 
0

嘗試這樣

SELECT `user_id`, `firstname`, `lastname`, `email`, `school_id`, `country_id` 
FROM (`users`) 
WHERE `user_id` != 1 
AND 
(`firstname` = 'thomas' 
OR `lastname` = 'thomas' 
OR `email` = 'thomas' 
OR `firstname` = 'jefferson' 
OR `lastname` = 'jefferson' 
OR `email` = 'jefferson') 
1

你要組織括號,在這種形式... 選擇user_idfirstnamelastnameemailschool_idcountry_id FROM(users) WHERE user_id!= '1' AND(firstname = '托馬斯' OR lastname = '托馬斯' OR email = '托馬斯' OR firstname ='傑弗遜''jefferson' 或email ='jefferson')

0

感謝您的回答!我通過這樣做來固定它;

$sql = "SELECT user_id, firstname, lastname, email, school_id, country_id FROM users WHERE user_id != " . $this->session->userdata('user_id'); 
    $firstname = array(); 
    $lastname = array(); 
    $email = array(); 

    foreach ($searchQuery as $a) 
    { 
     if (! empty($a)) 
     { 
      $firstname[] = "'".$a."'"; 
      $lastname[] = "'".$a."'"; 
      $email[] = "'".$a."'"; 
     } 
    } 
    $firstname = implode(',', $firstname); 
    $lastname = implode(',', $lastname); 
    $email = implode(',', $email); 

    $sql .= " AND(firstname IN($firstname) OR lastname IN($lastname) OR email IN($email))"; 

    $query = $this->db->query($sql); 

編輯:剛剛發現我沒有帶真正清除了弦從注射