[英]selecting distinct records from a mysql table
我有表log
,其中有一個列Message
,用於存儲日志信息。 消息將包含一些事件ID和日志說明,因此我想讀取具有不同事件ID的所有不同消息。
我嘗試了什么
select distinct message from log limit 100;
我收到所有不同的消息,但具有相同的事件ID
下一個
select * from log where
message not like "%1177%" and
message not like "%609%" and
message not like "%82%" and
message not like "%1107%" and
message not like "%23%"
order by ID DESC limit 10;
在這里獲取日志后,我必須再次添加一行以獲取下一個唯一的事件ID,例如如果我有23位,並且想要獲得其他23位,我必須添加message not like "%23%"
這樣的消息才能獲得23位以外的消息,該查詢的大小將越來越大。
那么,如何編寫一個查詢來選擇具有不同事件ID的不同消息呢?
編輯
Field | Type | Null | Key | Default | Extra |
+--------------------+------------------+------+-----+---------+----------------+
| ID | int(10) unsigned | NO | PRI | NULL | auto_increment |
| FromHost | varchar(60) | YES | | NULL | |
| Message | text | YES | | NULL | |
**edit**
樣本消息
1177|Malformed DNS Packet|12-2-15
1177|Malformed DNS Packet|11-2-15
1177|Malformed DNS Packet|11-1-15
609|IDP Prevention Alert|12-2-15
609 | IDP預防警報| 11-1-15
輸出
1177|Malformed DNS Packet|12-2-15
609|IDP Prevention Alert|11-1-15
select * from log where group by message,eventID
該查詢將根據唯一消息以及eventID返回日志
在標准SQL中,這將是:
SELECT
SUBSTRING(message FROM 1 FOR POSITION('|' IN message) -1) AS EventID
,MAX(message)
FROM tab
GROUP BY
SUBSTRING(message FROM 1 FOR POSITION('|' IN message) -1)
如果您不需要在結果中顯示EventId,則可以將其刪除。
在MySQL中,SUBSTRING / POISITION可以由SUBSTRING_INDEX代替(而且您可能也不需要MAX):
SUBSTRING_INDEX(message, '|', 1)
SELECT DISTINCT id, message
FROM "yourTable" GROUP BY id
那應該清楚地返回id和消息。
您可以使用MIN()
或MAX()
函數來實現此目的,因為您可以使用唯一的message
獲得不同的ID
。
SELECT MIN(ID),message FROM log GROUP BY message
要么
SELECT MAX(ID),message FROM log GROUP BY message
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.