php - MySQL 查询 - WHERE 和 IF?

标签 php mysql if-statement pdo

已解决: 国家和操作系统表中的数据类型设置为 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/

相关文章:

php - jQuery AJAX/PHP/MySQL 实时过滤

php - SQL内连接性能问题

javascript - 如何让服务器在普通 PHP/SQL 网站后面执行任务?

C++, 'if' 表达式中的变量声明

excel - 这段代码 : "Else without if error"? 我缺少什么

php - 如何在 PHP 中显示价格范围?

php - 如何限制输入文本中显示的字符数?

php - 如何在运行时运行 php 扩展

php - 当 MySQL 服务器消失时 Propel2 重新连接

C do while 循环用户选择