求助: 國家和操作系統的表中的數據類型被設置爲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%'時,它仍返回行
你爲什麼到處都用LIKE? – 2012-07-07 15:09:30
因爲,如果操作系統或country_code!= 0,那麼它將包含像「GB,US,FI」這樣的數據,並且我想檢查它是否在那裏。 :) – Prash 2012-07-07 15:10:44
這將意味着你有更深的問題。你的桌子結構壞了。你所做的事情在[SQL反模式](http://pragprog.com/book/bksqla/sql-antipatterns)書的第一章中有介紹。相反,您應該爲'CountryCodes'和聯結表'CommandCountryCodes'分開表來處理它們之間的多對多關係。 「OS」欄也一樣。 – 2012-07-07 15:15:26