是否可以在一个查询中执行此操作?例如,我有一个名为 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/