【问题标题】:Selecting multiple "most recent by timestamp" in mysql在mysql中选择多个“最新的时间戳”
【发布时间】:2009-12-01 22:25:21
【问题描述】:

我有一个表,其中包含各种服务器的日志条目。我需要为每个 idServer 创建一个包含最新(按时间)日志条目的视图。

mysql> describe serverLog;
+----------+-----------+------+-----+-------------------+----------------+
| Field    | Type      | Null | Key | Default           | Extra          |
+----------+-----------+------+-----+-------------------+----------------+
| idLog    | int(11)   | NO   | PRI | NULL              | auto_increment | 
| idServer | int(11)   | NO   | MUL | NULL              |                | 
| time     | timestamp | NO   |     | CURRENT_TIMESTAMP |                | 
| text     | text      | NO   |     | NULL              |                | 
+----------+-----------+------+-----+-------------------+----------------+

mysql> select * from serverLog;
+-------+----------+---------------------+------------+
| idLog | idServer | time                | text       |
+-------+----------+---------------------+------------+
|     1 |        1 | 2009-12-01 15:50:27 | log line 2 | 
|     2 |        1 | 2009-12-01 15:50:32 | log line 1 | 
|     3 |        3 | 2009-12-01 15:51:43 | log line 3 | 
|     4 |        1 | 2009-12-01 10:20:30 | log line 0 | 
+-------+----------+---------------------+------------+

让这件事变得困难(对我来说)是:

  • 较早日期/时间的条目可能会在以后插入,所以我不能只依赖 idLog。
  • 时间戳不是唯一的,所以我需要使用 idLog 作为“最新”的决胜局。

我可以使用子查询获得我想要的结果,但我不能将子查询放入视图中。另外,我听说 MySQL 的子查询性能很差。

mysql> SELECT * FROM (
    SELECT * FROM serverLog ORDER BY time DESC, idLog DESC
    ) q GROUP BY idServer;
+-------+----------+---------------------+------------+
| idLog | idServer | time                | text       |
+-------+----------+---------------------+------------+
|     2 |        1 | 2009-12-01 15:50:32 | log line 1 | 
|     3 |        3 | 2009-12-01 15:51:43 | log line 3 | 
+-------+----------+---------------------+------------+

写我的观点的正确方法是什么?

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    我推荐使用:

    CREATE OR REPLACE VIEW vw_your_view AS
      SELECT t.*
        FROM SERVERLOG t
        JOIN (SELECT sl.idserver,
                     MAX(sl.time) 'max_time'
                FROM SERVERLOG sl
            GROUP BY sl.idserver) x ON x.idserver = t.idserver
                                   AND x.max_time = t.time
    

    永远不要在 VIEW 中定义 ORDER BY,因为无法保证每次使用视图时都需要您指定的顺序。

    【讨论】:

    • +1 对于查询,不同意您对视图中 order by 的评论。可以订购用于特定应用的视图,而不是用于多个应用的​​通用视图
    • 是的,这取决于视图的应用程序,但这是一个例外而不是规则。除了在解释计划中看到排序之外,在检查视图之前您不会知道它发生在哪里。
    • 不幸的是,这个查询使用了 MySQL 不允许的子选择。
    • 哦,内部选择使用了 ORDER BY,因此当 GROUP BY 从每个分组中拉出第一行时,会选择正确的行。
    猜你喜欢
    • 2012-08-08
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多