2012-07-07 64 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