0

我正在尝试显示与特定时间范围匹配的结果-效果很好。但是,我想添加一个子句,说明显示的结果必须是 party_type12.

所以我做了这个

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

4 回答 4

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

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

于 2012-12-19T15:30:58.207 回答
3

运算符优先级中所述,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')
于 2012-12-19T15:32:42.160 回答
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
于 2012-12-19T15:32:40.130 回答
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')

我希望它有所帮助。

于 2012-12-19T16:47:06.777 回答