从mysql表中选择不同的记录

时间:2015-02-13 05:21:27

标签: mysql sql

我有表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

4 个答案:

答案 0 :(得分:1)

 select * from log where group by message,eventID

此查询将根据唯一消息和eventIDs

返回日志

答案 1 :(得分:1)

在标准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)

答案 2 :(得分:0)

SELECT DISTINCT id, message
FROM "yourTable" GROUP BY id

这应该明确地返回id和消息。

答案 3 :(得分:0)

您可以使用MIN()MAX()函数实现这一目标,因为您的ID具有唯一message。{/ p>

SELECT MIN(ID),message FROM log GROUP BY message

SELECT MAX(ID),message FROM log GROUP BY message