【问题标题】:PHP MySQL maxTime QueryPHP MySQL maxTime 查询
【发布时间】:2013-02-04 16:22:05
【问题描述】:

我有一个例程,每隔几个小时运行一次,并记录用户配置的备份作业。每个作业都会在表中创建一个条目,条目数可以是从 0 到无穷大的任意值(完全取决于用户拥有的作业数)。

在下面的示例中,用户当前配置了三个备份作业,但我使用的 SQL 查询是从一周前的数据提取中提取备份。我不知道如何调整我的查询,以便只从最近的时间戳中获取条目而不执行 LIMIT(我不能使用 LIMIT,因为我永远不知道将出现的条目数):

SELECT BACKUP_SET_ID, BACKUP_SET_TYPE, Max(SNAPSHOT_TIME) maxTime
FROM TABLE_snapshots_backupsets
WHERE ACCOUNT_ID='6000001'
GROUP BY BACKUP_SET_ID;

输出:

+---------------+----------------------------------+---------------------+  
| BACKUP_SET_ID | BACKUP_SET_TYPE                  | maxTime             |  
+---------------+----------------------------------+---------------------+  
| 1359127993672 | FILE                             | 2013-02-04 08:00:01 |  
| 1359145357475 | FILE                             | 2013-02-04 08:00:01 |  
| 1359145395067 | VMware Virtualization            | 2013-02-04 08:00:01 |  
| 1359145404910 | Microsoft Windows Virtualization | 2013-01-27 12:00:01 |  
+---------------+----------------------------------+---------------------+  
4 rows in set (0.00 sec)

因此,在上述情况下,我希望查询不要提取“Microsoft Windows 虚拟化”条目,因为用户在最近的数据提取时不再配置该条目。它应该只提取具有最新时间戳的条目。

谢谢!

【问题讨论】:

    标签: php mysql timestamp


    【解决方案1】:

    如果您只想要共享相同时间戳的最新条目,请重新排列逻辑:

    SELECT BACKUP_SET_ID, 
           BACKUP_SET_TYPE, 
           SNAPSHOT_TIME
    FROM TABLE_snapshots_backupsets
    WHERE SNAPSHOT_TIME = (SELECT Max(SNAPSHOT_TIME) 
                           FROM TABLE_snapshots_backupsets 
                           WHERE ACCOUNT_ID = '6000001')
    ;
    

    或者,如果您需要“时间范围”解决方案,请在 snapshot_time 上添加额外的 WHERE 子句

    WHERE ACCOUNT_ID='6000001' AND SNAPSHOT_TIME > CURTIME() - INTERVAL 7 DAY
    

    对于其他日期操作选项:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add

    【讨论】:

    • 感谢您的回复。当我添加那个 WHERE 子句时,我根本没有返回任何记录......
    • 谢谢!好的 - 重新排列的查询似乎可以解决问题。我必须将 ACCOUNT_ID 添加到第一个 WHERE 子句中才能使其仅返回该帐户的条目:SELECT BACKUP_SET_ID, BACKUP_SET_TYPE, SNAPSHOT_TIME FROM TABLE_snapshots_backupsets WHERE ACCOUNT_ID='6000001' AND SNAPSHOT_TIME = (SELECT Max(SNAPSHOT_TIME) FROM TABLE_snapshots_backupsets WHERE ACCOUNT_ID='6000001') GROUP BY BACKUP_SET_ID;
    • 哦,是的,现在可以删除 GROUP BY,因为主查询中不再有聚合函数。编辑了答案。
    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多