从mysql表中选择不同的记录

从mysql表中选择不同的记录,mysql,sql,Mysql,Sql,我有一个表log,其中有一个列Message,它存储日志信息。消息将包含一些事件ID和日志描述 所以我想用不同的事件ID读取所有不同的消息 我试过的 select distinct message from log limit 100; 我收到了所有不同的消息,但具有相同的事件ID 下一个 在这里,在获取日志后,我必须再次添加一行以获取下一个唯一事件id,就像我得到了23并且想要得到其他23一样,我必须添加消息,而不是“%23%”以获取除23之外的消息,并且此查询的大小将越来越大 那么,如何

我有一个表
log
,其中有一个列
Message
,它存储日志信息。消息将包含一些事件ID和日志描述 所以我想用不同的事件ID读取所有不同的消息

我试过的

 select distinct message from log limit 100;
我收到了所有不同的消息,但具有相同的事件ID

下一个

在这里,在获取日志后,我必须再次添加一行以获取下一个唯一事件id,就像我得到了23并且想要得到其他23一样,我必须添加
消息,而不是“%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 |国内流离失所者预防警报| 11-1-15

输出

1177|Malformed DNS Packet|12-2-15
609|IDP Prevention Alert|11-1-15
此查询将根据唯一消息以及EventID返回日志

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

这应该会清楚地返回id和消息。

您可以使用
MIN()
MAX()
函数来实现这一点,因为您的id与唯一的
消息有多达不同的
id

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


在标准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/poission可以被SUBSTRING\u索引替换(您可能也不需要MAX):


你的实际表模式是什么?@Dai,我已经添加了我的表的描述,请看一下,我不明白你的描述。你能显示一些
消息
值加上预期的结果吗?为什么这是结果?@dnoeth我已经编辑了我的问题事件ID不是一个不同的列,它将出现在消息中如果你看到我在这里的第二个查询,我写的是
消息不像“%23%”
那么231177609事件ID是正确的吗?你如何定义它们?是否有任何基于索引定义事件ID开始的标准大小?没有,这些ID将出现在开始位置,并且这些将是唯一的数字,因此如果我进行第二次查询,我将得到正确的结果,但是为了读取彼此的唯一记录,我必须编写消息,而不是……。将它们分开,直到通过正则表达式获得数字,使用嵌套查询对其进行重新迭代。您可以在此处添加两个示例日志消息吗?谢谢,但ID不是我正在查找的事件ID这只是一个主键。只需更改列名place event_ID而不是ID。event_ID不是一列,它将作为它的子部分出现在message列中。谢谢,但ID不是我正在查找的事件ID看,这只是一个主键。
SELECT MIN(ID),message FROM log GROUP BY message
SELECT MAX(ID),message FROM log GROUP BY message
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)
SUBSTRING_INDEX(message, '|', 1)