mysql - 将其重写为不包含子查询,以便我可以添加到 View

标签 mysql

请原谅我的无知——我在学习 MySQL 的同时,我真的被困在这个问题上:

我刚刚让这个查询正常工作,但是当我尝试将它添加到 View 时,我需要它在其中运行,但由于子查询,我做不到。我无法弄清楚如何避免子查询 - 你们中任何知识渊博的人都可以指出我正确的方向吗?

(SELECT `clients`.`Name` AS `ClientName`, `computers`.`Name` AS `ComputerName`, BackupName, results.Source, results.Result, results.Message, results.TimeGen, results.EventID
FROM 
(
SELECT DISTINCT 
  eventlogs.`ComputerID`, (
    CASE
      WHEN `eventlogs`.message LIKE '% job %'     
    THEN SUBSTR(`eventlogs`.`Message`, (LOCATE(' job ', `eventlogs`.`Message`) + 6), ((LOCATE('finished', `eventlogs`.`Message`) - LOCATE(' job ', `eventlogs`.`Message`)) - 8)) 
      ELSE NULL 
    END
  ) AS `BackupName`, `eventlogs`.`Source` AS `Source`, (
    CASE
      WHEN `eventlogs`.`message` LIKE 'Endpoint%Backup job % finished with Success%'
    THEN 'Pass' 
      WHEN `eventlogs`.`message` LIKE 'Endpoint%Backup job % finished with Warning%'
    THEN 'Pass-Warn' 
      WHEN `eventlogs`.`message` LIKE 'Endpoint%Backup job % finished with Fail%'      
    THEN 'FAIL' 
      WHEN `eventlogs`.`message` LIKE 'Endpoint%Backup job % finished with Error%'
    THEN 'FAIL' 
      ELSE 'Unknown - ASK ALEX!' 
    END
  ) AS `Result`, `eventlogs`.`Message` AS `Message`, `eventlogs`.`TimeGen` AS `TimeGen`, `eventlogs`.`EventID` AS `EventID` 

  FROM `eventlogs` 

  WHERE (
    `eventlogs`.`TimeGen` >= (NOW() - INTERVAL 1 DAY) 
    AND eventlogs.source = "Veeam Endpoint Backup" 
    AND EventID < 10000
    AND EventID != 110
    AND EventID != 1
  )
) AS results
INNER JOIN
(
  SELECT eventlogs.`ComputerID`,
  (CASE
  WHEN `eventlogs`.message LIKE '% job %'     
THEN SUBSTR(`eventlogs`.`Message`, (LOCATE(' job ', `eventlogs`.`Message`) + 6), ((LOCATE('finished', `eventlogs`.`Message`) - LOCATE(' job ', `eventlogs`.`Message`)) - 8)) 
  ELSE NULL 
END) AS `BackupName`, `eventlogs`.`Source` AS `Source`, eventlogs.Message, MAX(TimeGen) AS TimeGen, EventID
 FROM   `eventlogs` 

WHERE (
`eventlogs`.`TimeGen` >= (NOW() - INTERVAL 1 DAY) 
AND eventlogs.source = "Veeam Endpoint Backup" 
AND EventID < 10000
AND EventID != 110
AND EventID != 1 )
 GROUP BY ComputerID, Source, BackupName) AS latest USING (ComputerID, Source, BackupName, TimeGen)
JOIN `computers` USING (ComputerID)
JOIN `clients` USING (ClientID)
)

基本上对于每一个(计算机+BackupName)我都需要最近的事件,然后对它进行判断并输出结果。不幸的是,BackupName 是从 eventlogs.Message 列中的文本解析而来的。

抱歉,它有点长。欢迎任何帮助或建议 - 谢谢!

最佳答案

意识到我可以完全重写并仅将判断应用于“最新”数据集中的数据,而无需所有复杂性。只希望这在实践中确实能达到我想要的效果,哈哈。谢谢戈登。

SELECT `clients`.`Name` AS `ClientName`, `computers`.`Name` AS `ComputerName`, (CASE
  WHEN `eventlogs`.message LIKE '% job %'     
THEN SUBSTR(`eventlogs`.`Message`, (LOCATE(' job ', `eventlogs`.`Message`) + 6), ((LOCATE('finished', `eventlogs`.`Message`) - LOCATE(' job ', `eventlogs`.`Message`)) - 8)) 
  ELSE NULL 
END) AS `BackupName`, `eventlogs`.`Source` AS `Source`, (
    CASE
      WHEN `eventlogs`.`message` LIKE 'Endpoint%Backup job % finished with Success%'
    THEN 'Pass' 
      WHEN `eventlogs`.`message` LIKE 'Endpoint%Backup job % finished with Warning%'
    THEN 'Pass-Warn' 
      WHEN `eventlogs`.`message` LIKE 'Endpoint%Backup job % finished with Fail%'      
    THEN 'FAIL' 
      WHEN `eventlogs`.`message` LIKE 'Endpoint%Backup job % finished with Error%'
    THEN 'FAIL' 
      ELSE 'Unknown - ASK ALEX!' 
    END
  ) AS `Result`, eventlogs.Message, MAX(TimeGen) AS TimeGen, EventID
FROM    `eventlogs`  JOIN `computers` USING (ComputerID)
JOIN `clients` USING (ClientID)
WHERE (
`eventlogs`.`TimeGen` >= (NOW() - INTERVAL 1 DAY) 
AND eventlogs.source = "Veeam Endpoint Backup" 
AND EventID < 10000
AND EventID != 110
AND EventID != 1 )
GROUP BY ComputerID, Source, BackupName

关于mysql - 将其重写为不包含子查询,以便我可以添加到 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42743376/

相关文章:

php - 如何使用 MySQL 和 PHP 获取列中的总和

php - 数组还是关联?

mysql - 从热门主题标签获取最新推文 Mysql

mysql - 如何结合 Node.js 设置 MySQL

mysql - 我怎样才能用mysql得到这些?

mysql - (mySql)查询匹配/精确字符串/[通配符]/精确字符串/[通配符]等?

php - 来自 PHP 的 MySQL 查询

mysql - 非常慢的 MySQL 代码(内联和 JOINS)

mysql - 查询 搜索数据库中的文本字符串

mysql - 从数据库初始化一维数组