1

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

我不太确定如何编写此查询。基本上,我将有一个包含两列(OS 和 country_code)的表——还有更多列,但这些是有条件的。这些将被设置为全部或特定的 0,以逗号分隔。

现在,如果 OS 和 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 => Windows 7 country_code => GB 仅发送一个,不超过一个。我现在遇到的问题是,它适用于操作系统和时间,但不适用于国家。我什至尝试了一个原始查询,当表中的数据是“FR,SA”并且我做了 LIKE '%GB%' 它仍然返回了该行

4

1 回答 1

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 列。

于 2012-07-07T15:10:04.070 回答