0

我想做一个查询来检查今天是否有值,如果没有,则显示今天之前最接近的条目。

这是我使用的查询:

$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_updated2013-08-062013-08-04

2013-08-06如果今天使用此查询,为什么不返回前一天(或最近一天) ?

4

7 回答 7

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
于 2013-08-06T12:29:27.930 回答
2

mySQL 函数 NOW() 返回日期和当前服务器时间。您只表明您需要日期,因此您应该使用 CURDATE() 函数。

于 2013-08-06T12:32:20.723 回答
1

尝试:

SELECT * FROM table
WHERE
    something = variable
AND
    last_updated <= CURDATE()
ORDER BY
    last_updated DESC
LIMIT 1

last_updated可能能够通过向列添加索引来加快查询速度

于 2013-08-06T12:47:08.103 回答
0

last_updated我认为您应该在 where claus 中添加括号

SELECT * FROM `table` WHERE `something` = '".$variable."' 
        AND (`last_updated` = NOW() OR last_updated < NOW())

或者

只需删除last_updated = NOW()并将查询更改为

SELECT * FROM `table` WHERE `something` = '".$variable."' 
        AND last_updated <= NOW()
于 2013-08-06T12:27:00.797 回答
0

这是因为条目last_updated = 2013-08-04是与您的条件匹配的第一行last_updated < now()我确信查询也会返回第二行,但我猜您只是查看结果集中的第一行(只是猜测,因为您'的答案并没有说清楚)。所以添加一个

ORDER BY last_updated DESC

将确保第一行是符合您条件的最新行,同时另外添加

LIMIT 1

将确保它是唯一返回的。

于 2013-08-06T12:34:22.400 回答
0

我猜您无法获取 now() 的记录,您可以删除不需要的 now()(current timestamp) where 子句,并在没有something= '".$variable."' 条件的情况下检查您的查询,正如您提到的代码应该返回现在()(当前时间戳)以下的所有记录。

使用您提到的详细信息运行以下查询

SELECT * FROM `table` WHERE  
                   last_updated < NOW()

你会得到你所期望的。

于 2013-08-06T12:32:19.433 回答
0

尝试这个

$variable = 'var1';

SELECT * FROM `table` WHERE `something` = '".$variable."' 
                      AND `last_updated` <= NOW();
于 2013-08-06T12:32:27.107 回答