2016-11-11 47 views
0

這是包含日誌我的表:MySQL的排序分組的記錄

message     | data 
---------------------------------------------- 
ttt,tu10=UP,tu20=UP  | 2016-11-11 10:15:05 
ttt,tu10=DOWN,tu20=DOWN | 2016-11-11 10:13:05 
ttt,oper=UP,oper2=UP  | 2016-11-11 10:13:01 
ttt,oper=DOWN,oper2=DOWN | 2016-11-11 10:07:05 
hhh,tu10=UP,tu20=UP  | 2016-11-11 10:05:04 
hhh,tu10=DOWN,tu20=DOWN | 2016-11-11 10:05:01 
hhh,tu10=DOWN,tu20=DOWN | 2016-11-11 09:43:01 
hhh,tu10=UP,tu20=UP  | 2016-11-11 09:37:04 
hhh,tu10=DOWN,tu20=DOWN | 2016-11-11 09:35:05 
ttt,tu10=DOWN,tu20=DOWN | 2016-11-11 09:35:01 
ttt,tu10=UP,tu20=UP  | 2016-11-11 09:33:05 
ttt,tu10=DOWN,tu20=DOWN | 2016-11-11 05:35:01 
hhh,tu10=UP,tu20=UP  | 2016-11-11 05:33:05 

我創造了這個查詢:在屏幕上

SELECT * 
    FROM (
     SELECT 
      *,COUNT(*) AS count 
     FROM log 
     WHERE data > DATE_SUB(NOW(), INTERVAL 2 HOUR) 
     GROUP BY substring_index(message,',',1) 
    ) AS tmp 
WHERE count > 3 

打印: '信息', '數據', '計數'

獲取類似:

ttt,tu10=UP,tu20=UP  | 2016-11-11 09:33:05 | 6 
hhh,tu10=DOWN,tu20=DOWN | 2016-11-11 09:35:05 | 5 

而且我想得到第一個,像這樣:

ttt,tu10=UP,tu20=UP | 2016-11-11 10:15:05 | 6 
hhh,tu10=UP,tu20=UP | 2016-11-11 10:05:04 | 5 

我已經嘗試了幾種方法來排序,但我放棄了。

+0

ü沒有提到你想在你的問題是什麼?除了你預期的結果,請說你想要什麼關於這個結果。 – Zeina

+0

「GROUP BY substring_index(message,',',1)」這類問題是設計不佳的表現。 – Strawberry

+0

我想顯示一條消息,日期和出現次數,但是我想查看最新的消息和日期。 –

回答

0

我會建議使用substring_index()/group_concat()伎倆爲了這個目的:

SELECT SUBSTRING_INDEX(GROUP_CONCAT(message ORDER BY data DESC SEPARATOR '|'), '|', 1) as message, 
     MAX(data) as data, COUNT(*) AS count 
FROM log l 
WHERE data > DATE_SUB(NOW(), INTERVAL 2 HOUR) 
GROUP BY substring_index(message, ',', 1) 
HAVING COUNT(*) >= 3; 

請注意,GROUP_CONCAT()有一個內部限制由系統變量設置,與1024的默認值。如果消息超過這個長度,它將產生一個錯誤。您可以重置長度。

另一種方法是:

select l.* 
from (select substring_index(message, ',', 1) as m1, max(data) as maxd 
     from log 
     group by substring_index(message, ',', 1) 
     having count(*) >= 3 
    ) ll join 
    l 
    on ll.m1 = substring_index(l.message, ',', 1) and ll.maxd = l.data