我正在尝试在特定时间范围内显示该匹配的结果 - 这很好。但是,我想添加一个条款,说明显示的结果必须是party_type 1
或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
但是现在它显示了昨天的一些其他事件......但有趣的是,它没有显示任何更晚的事件。
答案 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')
我希望它有所帮助。