如果last_updated = NOW()或last_updated<从数据库中选择现在()

时间:2013-08-06 12:22:05

标签: php mysql sql select

我想查询是否有今天的值,如果没有,请在今天之前显示最近的条目。

这是我使用的查询:

$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使用此查询,前一天(或最接近的那一天)没有返回?

7 个答案:

答案 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

将确保它是唯一返回的。