求助: 国家和操作系统的表中的数据类型被设置为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