我有一个MySQL选择查询,在WHERE子句中几乎没有连接和多个条件。我在比较列datestart
和dateend
时遇到了问题。
这些可以适合给定的术语,也可以为空。两者的MySQL数据类型都是datetime
。
查询中有问题的部分如下:AND (a.datestart > '".$datestart."' AND a.dateend < '".$dateend."') OR (a.datestart > '".$datestart."' AND a.dateend is null) OR (a.datestart is null AND a.dateend < '".$dateend."') OR (a.datestart is null AND a.dateend is null))
如果我在没有这个部分的情况下运行查询,它运行正常。如果有,我会在Fatal error: Call to a member function fetch_assoc() on a non-object
行上收到以下错误:while($rows = $result->fetch_assoc())
。
我已经在查询中使用了a.something
语法,因此连接工作正常。
有什么想法吗?
编辑:根据请求发布整个查询(不是来自代码,而是具有特定示例值的示例。如果您需要php代码,我也会添加它。)
SELECT a.id AS id, t.title AS title, t.shortDescription AS shortDescription, p.prices_value AS prices_value, c.symbol AS symbol, a.rating AS rating FROM tblactivity a inner join tblactivitytranslations t on a.id = t.activityId inner join tblprices p on a.price = p.id inner join tblcurrencies c on p.currency = c.id WHERE t.lang = '0' AND t.title LIKE '%Some%' AND p.currency = '0' AND (false or (prices_value >= 0 and prices_value <= 25) or (prices_value >= 25 and prices_value <= 50) or (prices_value >= 50 and prices_value <= 75) or (prices_value >= 75 and prices_value <= 100) or (prices_value >= 100)) AND (a.datestart > '2000-1-1' AND a.dateend < '2079-1-1') OR (a.datestart > '2000-1-1' AND a.dateend is null) OR (a.datestart is null AND a.dateend < '2079-1-1') OR (a.datestart is null AND a.dateend is null))
答案 0 :(得分:0)
再次检查您的SQL查询。 WHERE
子句中的括号不会相加。在没有配对的左括号的情况下,您在null之后以双括号结束。
此外,还有一个false
没有定义列(这可能是SO帖子上的拼写错误,因为你提到你取消了最后一个语句并且一切运行正常)。
顺便说一下,你的WHERE子句可能有冗余。关于price_value的条件之一:
(prices_value >= 0 and prices_value <= 25)
or (prices_value >= 25 and prices_value <= 50)
or (prices_value >= 50 and prices_value <= 75)
or (prices_value >= 75 and prices_value <= 100)
or (prices_value >= 100)
可以在所有OR子句中组合成一个包含条件,因为所有端点都连接并超过100:
(prices_value >= 0)