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
问题发生在 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