我有两个我想要匹配的日志文件。一个表是来自三个服务器的原始Apache日志,全部下拉到一个用户ID,另一个是同一用户在另一个系统中的活动。 Apache正在为这个其他系统提供服务,但这两个日志并不是100%完全相同的时间戳。 Apache将为其他系统中的每个操作提供14个条目。它们通常具有相同的时间戳,但也可能是几秒钟不同步。它只是一个用户,我试图从Apache日志中获取该用户的IP地址,以便与其他日志上的特定操作相匹配。如果时间戳完全相同,我可以这样做。
这有效:
SELECT DISTINCT `a`.`Timestamp`, `a`.`OriginIP`,
`a`.`User_browser`, `c`.`Activity_ID`, `c`.`DATA`
from `Tomcat_server_logs` `a`
INNER JOIN `user_activity` `c` ON
`a`.`Timestamp`=`c`.`Timestamp`
INNER JOIN
(
SELECT `Timestamp`, `Activity_ID`, `DATA`
FROM `user_activity`
GROUP BY `Timestamp`
) b ON c.Timestamp = b.Timestamp AND
c.`Activity_ID` = b.`Activity_ID` AND
c.`DATA` = b.`DATA`
WHERE (c.`DATA` LIKE '%submit%') or (c.`DATA` LIKE '%uploadFile')
ORDER BY c.`Timestamp`;
但它只为我提供了与此用户完全相同的时间戳的IP地址。它略微跳过不同步的条目。
恐怕我已经被大脑打破,想弄清楚如何说出这样的话:
...
INNER JOIN `user_activity` `c` ON
((`a`.`Timestamp` <= ADDTIME(`c`.`Timestamp`,'0 0:0:4')
AND (`a`.`Timestamp` >= SUBTIME(`c`.`Timestamp`,'0 0:0:4'))
INNER JOIN
...
但显然这不是一个好的语法。