我想查询是否有今天的值,如果没有,请在今天之前显示最近的条目。
这是我使用的查询:
$variable = 'var1';
SELECT * FROM `table` WHERE `something` = '".$variable."'
AND `last_updated` = NOW() OR last_updated < NOW()
假设table
看起来像这样:
something | last_updated
var1 | 2013-08-04
var1 | 2013-08-05
var1 | 2013-08-06
如果我使用var1
= last_updated
删除2013-08-06
,则查询返回2013-08-04
如果今天2013-08-06
使用此查询,前一天(或最接近的那一天)没有返回?
答案 0 :(得分:4)
你有一个更大的问题,与运算符优先级有关:最后评估OR
,所以你的逻辑将在以下任一条件下包含一行:
something = variable AND last_updated = NOW()
,或 last_updated < NOW()
日期和时间等于NOW()
(当前日期和时间,到第二个)的可能性非常低,因此逻辑将转移到第二个条件,这可能会返回表中的每一行,因为它是只看last_updated
。
如果您想要something
最近更新的行(并禁止将来的更新日期),我建议您这样做:
SELECT * FROM table
WHERE something = variable
AND last_updated <= NOW()
ORDER BY last_updated
LIMIT 1
答案 1 :(得分:2)
mySQL函数NOW()返回日期和当前服务器时间。您只是表示您想要日期,因此您应该使用CURDATE()函数。
答案 2 :(得分:1)
尝试:
SELECT * FROM table
WHERE
something = variable
AND
last_updated <= CURDATE()
ORDER BY
last_updated DESC
LIMIT 1
可以通过向last_updated
列
答案 3 :(得分:0)
我认为你应该在where {/ p>中的last_updated
添加括号
SELECT * FROM `table` WHERE `something` = '".$variable."'
AND (`last_updated` = NOW() OR last_updated < NOW())
OR
只需删除last_updated = NOW()
并将查询更改为
SELECT * FROM `table` WHERE `something` = '".$variable."'
AND last_updated <= NOW()
答案 4 :(得分:0)
我猜你不能获取now()的记录,你可以删除不需要的now()(当前时间戳)where子句,并检查你的查询,而不是something
='“。$ variable。”条件,正如您所提到的,代码应返回所有低于now()(当前时间戳)的记录。
使用您提到的详细信息运行以下查询
SELECT * FROM `table` WHERE
last_updated < NOW()
你会得到你所期望的。
答案 5 :(得分:0)
试试这个
$variable = 'var1';
SELECT * FROM `table` WHERE `something` = '".$variable."'
AND `last_updated` <= NOW();
答案 6 :(得分:0)
这是因为带有last_updated = 2013-08-04
的条目是第一行符合您的条件last_updated < now()
我确信查询也会返回第二行,但我想你只是看看结果集中的第一行(只是猜测,因为你的答案并不清楚)。所以添加一个
ORDER BY last_updated DESC
将确保第一行是与您的条件匹配的最新行,同时另外添加
LIMIT 1
将确保它是唯一返回的。