mySQL 在每条消息的时间范围内显示日志?

标签 mysql sql

是否可以在一个查询中执行此操作?例如,我有一个名为 logs 的表,其中包含以下列:id、epoch、username、msg。

我需要搜索某个用户的消息,像这样:

select * from logs where username = 'bob'

现在我想从该消息的特定时间范围内选择来自 bob 的所有消息。

我知道我可以在 PHP 中使用 for 循环轻松完成此操作,但我必须使用 mySQL。

我最初想做这样的事情:

select * from logs where FROM_UNIXTIME(epoch) between
(select FROM_UNIXTIME(epoch) from logs where username = 'bob')
and
ADDTIME((select FROM_UNIXTIME(epoch) from logs where username = 'bob'), '03:00:00')

但这行不通,因为我的子查询将返回多个值。

我该怎么做?

编辑:我想对多条消息执行此操作,例如一些伪代码:

foreach epoch, message in (messages from logs where username = bob) as a do
print (select epoch, username, message from logs where epoch between a.epoch and ADDTIME(a.epoch, 3 hours))
end

但我必须使用 mySQL。可以在 mySQL 中执行此操作吗?

最佳答案

而不是任何类型的子查询,听起来您想要的可以通过表自身的 LEFT JOIN 来完成,但不是简单的连接条件,而是使用 epoch BETWEEN... 连接的 ON 子句中的条件。

联接的左侧将过滤为 username = 'bob',而右侧将在相关数据范围内定位消息。

如果需要,添加 DISTINCT 以删除重复的行。

SELECT
  DISTINCT
  rng.epoch,
  rng.username,
  rng.message
FROM
  logs AS main
  LEFT JOIN logs as rng 
    /* Join the epoch values from the table to related rows within 3 hours */
    ON rng.epoch BETWEEN main.epoch AND (a.epoch + INTERVAL 3 HOUR)
/* filter the main one for the desired username */
WHERE main.username = 'bob'

您的问题尚不清楚的是,您最终是否只想返回 bob 的行。如果是这种情况,则需要在 WHERE 子句中过滤连接的两侧,或者在 ON 子句中匹配的用户名:

FROM
  logs AS main
  LEFT JOIN logs as rng 
    ON rng.epoch BETWEEN main.epoch AND (a.epoch + INTERVAL 3 HOUR)
    /* match usernames so the related rows are only bob's
    AND main.username = rng.username

关于mySQL 在每条消息的时间范围内显示日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23035651/

相关文章:

mysql - 如何修复 MySQL 错误 1093

mysql - SQL 按季度和年份分组

MySQL - 使用所选内容更新行

php - 使用数据库值填充下拉列表并拆分字母排序

sql - 加速超过 60 亿次操作的 SQL 查询

php - 如何在 php 中获取超过 x 行的特定列值?

mysql - 使用 sorl-thumbnail 和 Django Admin

php - 将csv导入mysql数据库 - 错误

php - 无法从 XAMPP 控制面板启动 MySQL

mysql - MySQL 中的分区表