2012-06-15 71 views
25

我想在CI中結合AND OR mysql查詢。我已經看到這個線程:http://codeigniter.com/forums/viewthread/92818/。 但他們沒有提供確切的解決方案。在Codeigniter中結合mysql AND OR查詢

如何使用嚴格的CI框架創建以下查詢?(我可以輕鬆地創建查詢去掉括號,但那麼它是不一樣的查詢。)

SELECT * FROM `Persons` WHERE 
LastName='Svendson' AND Age="12" AND 
(FirstName='Tove' OR FirstName='Ola' OR Gender="M" OR Country="India") 

PS:這只是即使它沒有任何意義&不建議寫入完整或樣品查詢部分查詢內部單個where()

編輯:基本上我想下面這個簡單的查詢執行:

SELECT * FROM `table` WHERE field1='value1' AND (field2='value2' OR field3='value3') 

回答

35

這會工作嗎?無需擴展數據庫類和私有改變方法的訪問類型的公共數據庫類 - (> _ compile_select()$這個 - > DB)

$this->db->where('LastName', 'Svendson'); 
$this->db->where('Age', 12); 
$this->db->where("(FirstName='Tove' OR FirstName='Ola' OR Gender='M' OR Country='India')", NULL, FALSE); 
$query = $this->db->get('Persons'); 
return $query->result(); 
+2

是的,這將工作,這是我目前正在使用。但這不是嚴格的CI方式,我必須手動轉義字符串。另外我懷疑這樣的回答,所以在問題中提到過:「不要在單個where()中寫入查詢的整個OR部分」# – gopi1410

+3

我在最初的答案中問過你,如果你有一些理由來完成這個活動記錄,因爲在()IS'strict codeigniter'中定義了一個查詢,它只是不是活動記錄。無論如何,這在CI中是不可能的,因爲它們不允許你在AR中進行嵌套查詢。有一個名爲IgnitedQuery的查詢字符串構建器:http://www.assembla.com/wiki/show/IgnitedRecord/IgnitedQuery。 –

+0

這對我不起作用。條件覆蓋第一條件的第二條。 CodeIgniter V 2.1.4 – TARKUS

-2

查詢本身沒有意義,你選擇:

  • 託芙Svendson,年齡12
  • Ola Svendsen,年齡12
  • 任何名爲Svendson的男性,年齡12
  • 來自印度的任何人命名Svendson,12歲

託弗似乎是一個人的名字,所以選擇性別是不必要的。奧拉似乎是一個女孩的名字,因此選擇性別不僅是不必要的,而且它沒有任何意義。您的查詢將返回任何名爲Svendson的12歲男性,任何來自印度的12歲兒童Svenson,以及Tove和Ola Svendson,如果他們12歲。

爲什麼你不想把它放在()括號之間?出於某種原因,你是否想用活動記錄完成它?

+0

查詢只是一個測試。我隨機寫了一些想到的東西。基本上我需要f1 = v1 AND(f2 = v2或f3 = v3)種查詢 – gopi1410

+0

&我的問題也沒有關於選擇,所以你不需要分析我的查詢 – gopi1410

+0

也編輯了我的問題..希望你能得到它時間! – gopi1410

1

目前與CI2您無法訪問查詢生成器方法/保護,這就像使用ActiveRecord類來構建子查詢一樣。唯一的方法進行子查詢像一個你試圖建立將只使用該數據庫查詢方法

$table = $this->db->dbprefix('tablename'); 

$sql = "SELECT * FROM `{$table}` WHERE field1='?' AND (field2='?' OR field3='?') "; 
$this->db->query($sql,array($field1,$field2,$field3)); 

有大約在CI Subquerys這樣一篇博客文章,但它是過時的,只適用於CI 1.7希望有所幫助。

34

在CodeIgniter 3中有一些新的方法group_start() and group_end(),它們完全用於此目的。

return $this->db 
    ->where('LastName', 'Svendson'); 
    ->where('Age', 12); 
    ->group_start() 
     ->where('FirstName','Tove') 
     ->or_where('FirstName','Ola') 
     ->or_where('Gender','M') 
     ->or_where('Country','India') 
    ->group_end() 
    ->get('Persons') 
    ->result(); 
+0

這個版本是什麼時候發佈的?> –

+0

現在就是這樣做的。 +1 –

+0

糾正我,如果我錯了請。除了最後一個,你的聲明中是否需要有一個分號?對不起CI的新手, –

2

在Codeigniter中,我們可以像這樣使用它很容易理解。

$sql = "SELECT 
      * 
     FROM 
      `Persons` 
     WHERE 
      LastName = 'Svendson' 
     AND Age = '12' 
     AND (
      FirstName = 'Tove' 
      OR FirstName = 'Ola' 
      OR Gender = 'M' 
      OR Country = 'India' 
     )"; 

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

return $query->result(); 
+0

給我,它似乎比內置函數更容易 – snAtchnAren

4

您可以使用此嘗試只是

$this->db->where("status","live")->or_where("status","dead"); 

你也可以使用

$this->db->where("(status='live' OR status='dead')");