使用括号

时间:2015-07-17 18:03:30

标签: php mysql

我正在尝试从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。

出于某种原因,这将返回如上所示的结果,其中已达到限制。它也没有正确过滤掉日期或其他变量。

我的查询显然有问题,但我无法弄清楚。有什么建议吗?

1 个答案:

答案 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以了解有关运营商优先级的更多信息。