1
我有一个包含各种服务器日志条目的表。我需要为每个idServer
创建一个最近(按时间)日志条目的视图。在mysql中选择多个“最近按时间戳”
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作为“最新”的tiebreaker。
我可以得到我想要使用子查询的结果,但我不能把子查询放入视图中。另外,我听说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 |
+-------+----------+---------------------+------------+
什么是写我的观点的正确方法?
+1对于该查询,不同意您对于在视图中的排序的评论。可以订购用于特定应用的视图,这与多个应用使用的普通视图相反 – Andomar 2009-12-01 23:01:38
确实取决于视图的应用,但这是比规则更多的例外。除了在解释计划中看到排序之外,在检查视图之前,您不会知道它发生的位置。 – 2009-12-01 23:08:29
不幸的是,这个查询使用了MySQL不允许的子查询。 – MikeyB 2009-12-02 14:12:29