2012-07-07 60 views
1

求助: 國家和操作系統的表中的數據類型被設置爲VARCHAR,所以在我的地方,我改變了= 0 = ='0'。 感謝raina77ow指出這一點!欣賞它。MySQL查詢 - WHERE和IF?

我不太清楚如何編寫此查詢。基本上,我將有一個包含兩列(OS和country_code)的表 - 更多的列,但這些是有條件的。對於全部或者特定的,這些將被設置爲0,以逗號分隔。

現在,我想要實現的是如果操作系統和country_code = 0或者它們包含匹配數據(用逗號分隔)從表中提取數據。

然後,我有一個時間專欄。我想選擇時間大於時間列的行,除非列time_t設置爲false,在這種情況下,這應該不重要。

我希望我解釋一下吧?

這是我種得至今:

$get = $db->prepare("SELECT * FROM commands 
    WHERE country_code = 0 OR country_code LIKE :country_code 
    AND OS = 0 OR OS LIKE :OS 
    AND IF (time_t = 1, expiry > NOW()) 
"); 
$get->execute(array(
    ':country_code' => "%{$data['country_code']}%", 
    ':OS' => "%{$data['OS']}%" 
)); 

編輯:這是我現在使用的代碼,但我似乎仍不能得到OS和COUNTRY_CODE部分工作:

$get = $db->prepare("SELECT * FROM commands 
WHERE (country_code = 0 OR country_code LIKE :country_code) 
AND (OS = 0 OR OS LIKE :OS) 
AND (time_t <> 1 OR expiry > NOW()) 
"); 

$get->execute(array(
':country_code' => "%{$data['country_code']}%", 
':OS' => "%{$data['OS']}%" 
)); 

發送到DB數據將是: OS => Windows 7的 COUNTRY_CODE => GB 只有一個會被髮送,不超過一個。我現在遇到的問題是,它在爲OS和時間事情工作,但它不適用於該國。我甚至嘗試過一個原始查詢,當表中的數據是「FR,SA」並且我做了LIKE'%GB%'時,它仍返回行

+0

你爲什麼到處都用LIKE? – 2012-07-07 15:09:30

+0

因爲,如果操作系統或country_code!= 0,那麼它將包含像「GB,US,FI」這樣的數據,並且我想檢查它是否在那裏。 :) – Prash 2012-07-07 15:10:44

+1

這將意味着你有更深的問題。你的桌子結構壞了。你所做的事情在[SQL反模式](http://pragprog.com/book/bksqla/sql-antipatterns)書的第一章中有介紹。相反,您應該爲'CountryCodes'和聯結表'CommandCountryCodes'分開表來處理它們之間的多對多關係。 「OS」欄也一樣。 – 2012-07-07 15:15:26

回答

1

這是邏輯運算符優先級的問題:AND高於OR的階梯,所以你的原始查詢會被執行...

WHERE country_code = 0 OR (country_code LIKE ... AND OS = 0) OR OS LIKE... 

使用括號以分開你的條件,如:

WHERE (country_code = 0 OR country_code LIKE ...) 
    AND (OS = 0 OR OS LIKE ...) 

而在此查詢最終的過濾條件,我假設,應該寫成...

AND (time_t <> 1 OR expiry > NOW()) 

UPDATE:...它實際上是應該country_code = '0'或類似這樣的東西在你的代碼。記住,你正在檢查VARCHAR列。

+0

謝謝。我編輯了一下我的代碼以匹配它。 – Prash 2012-07-07 15:19:06

+0

對。好的。國家代碼將爲0或像「GB」或像「GB,美國,NI」這樣的數據 - 操作系統將與上述幾乎相同。 我只希望在滿足BOTH條件的情況下拉行。如果那有意義的話? – Prash 2012-07-07 15:22:46

+0

我說的不是數據庫中的數據 - 我正在談論查詢。由於查詢顯然是失敗的。所以我想知道什麼_exactly_發送到數據庫,哪些字符串綁定到查詢。它不能是'%GB,US,NI%',對吧? – raina77ow 2012-07-07 15:26:44