我正在尝试从mysql表中查询所有有效折扣。
设置如下:
ID ItemID ProviderID ConditionID GradeID DiscLimit DiscRedeemed DiscExp
1 0 0 3 0 10 10 0000-00-00 00:00:00
DiscExp
是日期时间。
在任何给定时间,ItemID,ProviderID,ConditionID或GradeID中只有一个值的值不是0。
我正在尝试查询所有有效折扣,其中&#34;限制&#34;尚未到达DiscRedeemed < DiscLimit
且尚未过期DiscExp < NOW()
以下是查询:
$query = $db->query("SELECT * FROM `store_item_discounts` WHERE
(ItemID > 0 AND ItemID = '$item[ID]')
OR (ProviderID > 0 AND ProviderID = '$item[Provider]')
OR (ConditionID > 0 AND ConditionID = '$item[ItemCondition]')
OR (GradeID > 0 AND GradeID = '$item[ItemGrade]')
AND (DiscLimit = 0 OR DiscRedeemed < DiscLimit)
AND (DiscExp = '0000-00-00 00:00:00' OR DiscExp > NOW())
ORDER BY DiscType ASC");
在$item
数组中,除$item['ItemCondition']
等于3外,所有值均为0。
出于某种原因,这将返回如上所示的结果,其中已达到限制。它也没有正确过滤掉日期或其他变量。
我的查询显然有问题,但我无法弄清楚。有什么建议吗?
答案 0 :(得分:0)
您遇到运营商优先权问题。由于AND
运算符的优先级高于OR
运算符,因此WHERE
子句看起来很像:
WHERE
(
(ItemID > 0 AND ItemID = '$item[ID]')
OR (ProviderID > 0 AND ProviderID = '$item[Provider]')
OR (ConditionID > 0 AND ConditionID = '$item[ItemCondition]')
) OR (
(GradeID > 0 AND GradeID = '$item[ItemGrade]')
AND (DiscLimit = 0 OR DiscRedeemed < DiscLimit)
AND (DiscExp = '0000-00-00 00:00:00' OR DiscExp > NOW())
)
所以ConditionID = 3
是返回行的充分条件。正如 Uueerdo 指出的那样,您需要在另一对括号中包含所有OR条件。您的查询应如下所示:
$query = $db->query("SELECT * FROM `store_item_discounts` WHERE
(
(ItemID > 0 AND ItemID = '$item[ID]')
OR (ProviderID > 0 AND ProviderID = '$item[Provider]')
OR (ConditionID > 0 AND ConditionID = '$item[ItemCondition]')
OR (GradeID > 0 AND GradeID = '$item[ItemGrade]')
) AND (DiscLimit = 0 OR DiscRedeemed < DiscLimit)
AND (DiscExp = '0000-00-00 00:00:00' OR DiscExp > NOW())
ORDER BY DiscType ASC");
请参阅MySQL documentation以了解有关运营商优先级的更多信息。