簡體   English   中英

從mysql表中選擇不同的記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM