Mysql 从时间戳获取登录用户

Mysql 从时间戳获取登录用户,mysql,datetime,Mysql,Datetime,我的数据库中有两个表。其中一个跟踪用户登录的时间:id、名称、IP和时间戳。另一个是一系列事件:id、事件名称、IP和时间戳 是否有一种简单的方法可以查看给定特定事件的哪个用户登录 例如,如果我有 id l_ip l_user l_time 0 172.16.1.10 ces77 2010-12-14 09:02:12 1 172.16.1.64 ces34 2010-12-14 10:06:43 2 172.16.1.10 ces47

我的数据库中有两个表。其中一个跟踪用户登录的时间:id、名称、IP和时间戳。另一个是一系列事件:id、事件名称、IP和时间戳

是否有一种简单的方法可以查看给定特定事件的哪个用户登录

例如,如果我有

id  l_ip          l_user  l_time
0   172.16.1.10   ces77   2010-12-14 09:02:12
1   172.16.1.64   ces34   2010-12-14 10:06:43
2   172.16.1.10   ces47   2010-12-14 11:10:52

我可以运行一个查询,为每一个事件提供一个用户,这样它就可以生成

id  e_name   e_ip         e_time               l_user
0   remove   172.16.1.10  2010-12-14 09:10:33  ces77
1   run      172.16.1.64  2010-12-14 10:15:10  ces34
2   change   172.16.1.64  2010-12-14 10:20:32  ces34
3   run      172.16.1.10  2010-12-14 12:55:59  ces47
UPD>

SELECT e.id, e_name, e_ip, e_time, l_user
FROM events e
  INNER JOIN loggedin l ON e.e_ip = l.l_ip AND e.e_time >= l.l_time

这就是您所需要的吗?

处理这一问题的最佳方法是通过访问数据库的代码。这可能不会太快,因为没有有效回答问题的必要数据;您必须查看记录,然后针对每个记录回答“此时哪个用户登录了?”

建议对模式执行一点de-规范化,并允许用户信息显示在两个表中。如果使用用户名作为用户表的键,则可以将l_user列设置为指向该表的FK。当然,您仍然需要编写一个程序来更新表,以包含您首先要查找的数据,并且无法使其对所有时间戳都100%正确,除非您可以保证某些事情,例如“用户没有在时间戳a和B之间注销”等等


我先写一个程序来回答你现在想回答的问题,然后我会强烈考虑对数据结构做一些改进,这样你就可以用一个SQL查询来回答这个问题。基本上,迭代每个事件,找出事件发生时谁登录了,并将其写在某个地方(当然,除非您有能力将该信息保存在内存中以便以后使用)。

不完全如此。问题是事件与某人登录的确切时间不一致。我需要查看在事件时间戳之前登录的用户。感谢回复。请参阅更新,这里只选择登录后发生的事件。这几乎是完美的;我只是稍微调整了一下。非常感谢,你帮我省了几个小时的工作!起初我认为另一个解决方案有效,但后来意识到它不起作用。它将返回以前登录的任何用户。我认为迈克尔是对的。。。但这意味着我必须重新设计程序的某些部分:(假设用户总是在事件发生时登录,请参阅我与您的数据集相对应的答案。@Danosure:这是一种有趣的方法,但最好先支付一次聚合和验证数据的费用,然后转移到一个记录了所有适当信息的模型。除非有很好的理由否则,对我来说,最有意义的是保持读取数据的低成本:已经有足够的数据处理任务需要花费时间,而不需要额外的处理来回答这样的问题……我并不是说唯一的解决方案是我的,但我确实倾向于将这样的任务的负载放在服务器上,以获得连接的能力,与改造轮子应用程序不同。DB服务器往往比web主机有更多的RAM/CPU。我的答案是OP的替代方案,与你的答案不矛盾。哦,不,我理解。我只是说负载可以放在DB服务器上,效率更高。短期而言,应用程序中的混乱(或报表生成工具,或数据库);长期而言,修复根本问题,这样就不需要这些麻烦,用户也不必为需要改进的设计支付费用。这就是为什么我说最好提前付款,因为这是一个很容易隐藏的问题(对用户而言)成本和请求时间可以保持快速。我知道,在我目前管理的应用程序中,按请求付费会导致应用程序死机。
SELECT e.id, e_name, e_ip, e_time, l_user
FROM events e
  INNER JOIN loggedin l ON e.e_ip = l.l_ip AND e.e_time >= l.l_time