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