SQL "OR" 运算符未按 php 中的预期进行评估

SQL "OR" operator not evaluating as expected in php

问题发生在 wo.status = 'in_progress' 或 'ongoing' 部分执行时。 如果 'in_progress' returns 为真但 'ongoing' returns 为假,则总体结果为假(即 wo.status 既不是 in_progress 也不是正在进行的)。我正在寻找的结果是,如果 'in_progress' 或 'ongoing' 为真,则总体结果为真。

我正在按如下方式查询数据库:

SELECT wo.*, c.address 
FROM WorkOrder AS wo 
LEFT JOIN Customer AS c 
ON c.id = wo.customer_id 
LEFT JOIN AssignedTechs AS at 
ON at.work_order_id = wo.id 
WHERE at.technician_id = ? 
&& wo.status = 'in_progress' 
OR 'ongoing' AND at.active";

你有两个问题;首先,OR 和 = 不能一起工作;你是说

wo.status = 'in_progress'
OR
'ongoing'

这首先测试 wo.status 是否为 in_progress。如果是,则结果为真;如果不是,它检查 OR 的第二个操作数,它将 'ongoing' 转换为一个数字并简单地测试它是否是 non-zero,与 wo.status 的值无关。由于它没有前导数字,因此它转换为 0,这是错误的。你想要:

wo.status = 'in_progress' OR wo.status = 'ongoing'

wo.status IN ('in_progress','ongoing')

你的第二个问题是 OR 的优先级低于 &&/AND。所以你在做:

(at.technician_id = ? && wo.status = 'in_progress')
OR
('ongoing' AND at.active)

您想用括号括起您的 OR 条件(除非您使用上面的 IN 运算符来避免 OR):

at.technician_id = ?
&& (wo.status = 'in_progress' OR wo.status = 'ongoing')
AND at.active