我找到了question这也许可以解释我得到的结果。但这似乎仍然是一个奇怪的行为。
我们有一个充满供应商产品的表,它每天都会更新(从 xml 读取新数据)。在此过程中,“已更新”列会获取新的日期时间值。从供应商 xml 文件中消失的产品应在“标志”列中标记为 EOL
从 xml 文件导入后,我运行以下 SQL 来尝试查找应标记为 EOL 的产品。
SELECT * FROM `app_supplier_products` WHERE `flag` != 'EOL' AND `supplier_id` = 1 AND `updated` < '2014-12-29 07:15:01'
但是这没有返回任何行。如果我们将时间更改为 07:15:15,我们确实得到了结果。似乎较小的比较没有返回另一天的行。
在做了一些其他测试后,我们设法让它与以下 SQL 一起工作:
SELECT * FROM `app_supplier_products` WHERE (`flag` IS NULL OR `flag` = 'MODIFIED') AND `supplier_id` = 1 AND `updated` < '2014-12-29 07:15:01'
此时,标志列可以为 NULL、MODIFIED 或 EOL。将来我们可能会添加其他可能的值。这意味着当我们添加另一个值时,我们必须更新所有查询。
为什么第一个查询没有返回预期的行?
最佳答案
将查询更改为:
SELECT * FROM `app_supplier_products` WHERE NOT (`flag` <=> 'EOL') AND `supplier_id` = 1 AND `updated` < '2014-11-29 07:15:01'
这使用 null-safe equality运算符,因此它将匹配 flag = NULL
的行。
如果您无法使用此运算符,您可以使用:
SELECT * FROM `app_supplier_products` WHERE (`flag` IS NULL OR FLAG != 'EOL') AND `supplier_id` = 1 AND `updated` < '2014-11-29 07:15:01'
关于php - 用于比较的奇怪 MySQL 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27690592/