MySQL查询 - WHERE和IF?

时间:2012-07-07 15:06:19

标签: php mysql if-statement pdo

解决: 国家和操作系统表中的数据类型设置为VARCHAR,因此在我的位置,我将= 0更改为='0'。 感谢raina77ow指出这一点!欣赏它。

我不太确定如何编写此查询。基本上,我将有一个包含两列(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']}%"
));
编辑:这是我现在使用的代码,但我似乎仍无法使操作系统和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']}%"
));

发送到数据库的数据是: OS =&gt; Windows 7的 country_code =&gt; GB 只有一个会被发送,不会超过一个。我现在面临的问题是,它适用于操作系统和时间,但它不适用于该国。我甚至尝试了一个原始查询,当表中的数据是“FR,SA”并且我做了LIKE'%GB%'它仍然返回行

1 个答案:

答案 0 :(得分: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() )

更新:......实际应该是country_code = '0'或类似的代码。您正在检查VARCHAR列,请记住。