AND OR导致出现比应该更多的结果

时间:2012-12-19 15:29:01

标签: mysql

我正在尝试在特定时间范围内显示该匹配的结果 - 这很好。但是,我想添加一个条款,说明显示的结果必须是party_type 12

所以我做了这个

WHERE start_datetime >= '$DATE_START_SELECTED'
AND end_datetime < '$DATE_END_SELECTED' 
AND PARTY_TYPE='1'
OR PARTY_TYPE='2'
GROUP BY events.ENTRANCE_PRICE

但是现在它显示了昨天的一些其他事件......但有趣的是,它没有显示任何更晚的事件。

4 个答案:

答案 0 :(得分:9)

这应该可以解决问题

WHERE start_datetime >= '$DATE_START_SELECTED'
AND end_datetime < '$DATE_END_SELECTED' 
AND (PARTY_TYPE='1'
OR PARTY_TYPE='2')
GROUP BY events.ENTRANCE_PRICE

整个事物的清洁版本将是

WHERE start_datetime >= '$DATE_START_SELECTED'
AND end_datetime < '$DATE_END_SELECTED' 
AND (PARTY_TYPE IN (1,2))
GROUP BY events.ENTRANCE_PRICE

您可能还想查看here以了解有关使用Multiple WHERE条件的更多信息。

答案 1 :(得分:3)

正如Operator Precedence中所述,AND的优先级高于OR。因此,您当前的过滤器评估为:

WHERE (      start_datetime >= '$DATE_START_SELECTED'
         AND   end_datetime <  '$DATE_END_SELECTED' 
         AND PARTY_TYPE='1'
      )   OR PARTY_TYPE='2'

您应该添加括号以强制符合您要求的优先级:

WHERE       start_datetime >= '$DATE_START_SELECTED'
        AND   end_datetime <  '$DATE_END_SELECTED' 
        AND  (PARTY_TYPE='1' OR PARTY_TYPE='2')

或者,使用MySQL的IN()运算符:

WHERE       start_datetime >= '$DATE_START_SELECTED'
        AND   end_datetime <  '$DATE_END_SELECTED' 
        AND  PARTY_TYPE IN ('1','2')

答案 2 :(得分:2)

您需要使用括号来确保根据需要对布尔值进行求值。特别是,聚在一起

(PARTY_TYPE='1' OR PARTY_TYPE='2')

给你

WHERE start_datetime >= '$DATE_START_SELECTED'
AND end_datetime < '$DATE_END_SELECTED' 
AND (PARTY_TYPE='1' OR PARTY_TYPE='2')
GROUP BY events.ENTRANCE_PRICE

答案 3 :(得分:0)

在您的查询中,AND和OR的级别存在歧义。你想把两个条件放在同一级别:关于日期开始,日期结束(这些都没问题)和party_type(1或0)。相反,在您的查询中,您将它们视为四个独立的。请按照以下方式处理:

    start_datetime >= '$DATE_START_SELECTED'
    end_datetime < '$DATE_END_SELECTED' 
    AND (PARTY_TYPE='1' OR PARTY_TYPE='2')

我希望它有所帮助。