2012-11-18 45 views
6

我有一個查詢的在它下面的條件(負選擇,從等)笨DB查詢與在,或,和..和像

$this->db->where('show_year', $yyyy); 
$this->db->or_where('idn', $idn); 
$this->db->or_like('post_slug', $idn); 

形成

SELECT * FROM (`nyb_articles`) 
WHERE `show_year` = '2009' 
OR `idn` = 'the' 
AND `post_slug` LIKE '%the%' 

然而我期待有它更像

SELECT * FROM (`nyb_articles`) 
WHERE `show_year` = '2009' 
AND (`idn` = 'the' OR `post_slug` LIKE '%the%') 

我的問題是林不知道如果CI的活動記錄支持這一概念,如果是的話,怎麼會我解決它,因爲我無法在文檔中的任何地方找到它的概念。無論如何改變like,or_like,where, or_where我甚至不能指出類似的東西。所以任何人有任何想法?如果可能的話,我寧願遠離原始查詢,但如果我必須準備一個並以這種方式進行操作,那麼我會,只是不願意。

+0

我想這個答案也許會有幫助,http://stackoverflow.com/questions/11937867/nested-where-clauses-codeigniter-mysql-查詢/ 11940789#11940789只是拋出'(...)'部分在一個'$ this-> db-> where()'調用爲一個字符串(用'()'s) – complex857

+0

我想你可能會與那個一起。希望有一種方法可以將它分解成多個部分,以便隨着時間的變化更容易地進行更改,並沿着通過隨機條件構建整個查詢的整條線路,但如果這是唯一的情況我認爲,好的發現 – chris

回答

2

你試過這個嗎?

SELECT * FROM (`nyb_articles`) 
WHERE `show_year` = '2009' AND `idn` = 'the' 
OR `show_year`='2009' AND `post_slug` LIKE '%the%' 

我認爲有以下產生上述表達式:

$this->db->select(...)->from(...)-> 
where("show_year","2009")->where("idn","the")-> 
or_where("show_year","2009")->like("post_slug","%the%") 
+1

從可讀性/可維護性的角度來看,混合'AND'和'OR'沒有括號可能是一個壞主意,即使分佈性現在按預期工作。更好地發揮它的安全性並使用[DNF](http://en.wikipedia.org/wiki/Disjunctive_normal_form)或[CNF](http://en.wikipedia.org/wiki/Conjunctive_normal_form)子句。 – complex857

+0

我知道,但與CI的AR不能做圓括號。這只是一個(難看的)解決方法。檢查mysql中的操作員偏好設置:http://dev.mysql.com/doc/refman/5.0/en/operator-precedence.html - mysql在'OR'後首先評估'AND'。 – uzsolt