显然,我错过了树木的森林......我在这里错过了一些明显的东西!
场景:
我有一个典型的表asset_locator
,其中包含多个字段:
id, int(11) PRIMARY
logref, int(11)
unitno, int(11)
tunits, int(11)
operator, varchar(24)
lineid, varchar(24)
uniqueid, varchar(64)
timestamp, timestamp
我目前面临的挑战是根据日期范围从此表中选择记录。更具体地说,使用 MAX(时间戳)字段的日期范围。所以。。。选择"我需要从最新的时间戳值开始"并返回 3 天时。
例如:我选择lineid
= 'xyz' 的所有记录,并从最新时间戳返回 3 天。下面是我一直在尝试运行的一个实际示例(数十个)。MySQL 返回一行,其中包含以下所有 NULL 值:
SELECT id, logref, unitno, tunits, operator, lineid,
uniqueid, timestamp, MAX( timestamp ) AS maxdate
FROM asset_locator
WHERE 'maxdate' < DATE_ADD('maxdate',INTERVAL -3 DAY)
ORDER BY uniqueid DESC
我一定缺少一些明显的东西。如果有人有任何想法,请分享。非常感谢!
MAX() 是一个聚合函数,这意味着您的 SELECT 将始终返回一行包含最大值。除非您使用 GROUP BY,但看起来这不是您所需要的。
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_max
如果您需要 MAX(时间戳) 和 3 天之前的所有条目,则需要进行子选择以获取最大日期,然后在搜索条件中使用它。喜欢这个:
SELECT id, logref, unitno, tunits, operator, lineid, uniqueid, timestamp
FROM asset_locator
WHERE timestamp >= DATE_ADD( (SELECT MAX(timestamp) FROM asset_locator), INTERVAL -3 DAY)
只要您在列上定义了索引timestamp
它仍将高效运行。
注意:在您的示例中
WHERE 'maxdate' < DATE_ADD('maxdate',INTERVAL -3 DAY)
在这里,您实际上使用了字符串"maxdate",因为引号导致条件返回 false。这就是为什么您看到所有字段都为 NULL。
编辑:哎呀,忘记了查询中的"FROM asset_locator"。在写答案时,它在某个时候迷失了:)