已解决: 国家和操作系统表中的数据类型设置为 VARCHAR,因此在我的位置,我将 = 0 更改为 = '0'。 感谢 raina77ow 指出这一点!欣赏它。
我不太确定如何编写此查询。基本上,我将有一个包含两列(OS 和 country_code)的表 - 还有更多列,但那些是有条件的。这些将全部设置为 0,或将特定设置为 0,以逗号分隔。
现在,我正在尝试实现的是,如果操作系统和国家/地区代码 = 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']}%"
));
发送到数据库的数据将是: 操作系统 => Windows 7 国家代码 => GB 只会发送一个,不会超过一个。我现在遇到的问题是,它适用于操作系统和时间,但不适用于国家/地区。我什至尝试了一个原始查询,当表中的数据是“FR,SA”并且我做了 LIKE '%GB%' 它仍然返回行
最佳答案
这是一个逻辑运算符优先级的问题: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 列。
关于php - MySQL 查询 - WHERE 和 IF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11376084/