所以我有一个类似于这样的MySQL表:
id timestamp action timePassed
1 2012-07-10 22:44:00 start 0
2 2012-07-10 22:44:50 pause 50
3 2012-07-10 22:45:30 play 50
4 2012-07-10 22:47:25 pause 205
5 2012-07-10 22:48:05 play 205
我不知道它有多明显但是这里发生的事情基本上是在每个“暂停”行上我计算当前时间戳与“开始”行的时间戳之间的秒差。
我能想到这样做的唯一方法是在数据库中插入一个新的“暂停”行,以便生成时间戳...然后在数据库中查询该“暂停”行的时间戳...计算使用PHP在'pause'行和'start'行之间的秒数差异...然后使用timePassed结果更新'pause'行。
我的问题是,是否有更好的方法(即使用timediff或其他一些MySQL命令)。问题是'暂停'时间戳在我进行INSERT之前不存在,所以我觉得在我进行任何计算之前需要先发生这种情况吗?
答案 0 :(得分:0)
我能想到的唯一方法是插入一个新的“暂停”行 进入数据库,生成时间戳...然后查询 数据库中“暂停”行的时间戳...计算 'pause'行和'start'行之间的秒数差异 使用PHP ...然后使用timePassed结果更新'pause'行。
您可以插入已计算的行。
INSERT INTO table (timestamp, action, timePassed)
SELECT now(), 'pause', SECOND(timediff(now(), timestamp))
FROM table
WHERE action = 'start'; -- and/or other WHERE clauses.
由于检索“开始”行所需的时间(但在操作时有索引(如果行非常大,可能是时间戳),这将引入时间偏差,该时间应该可以忽略不计)。
答案 1 :(得分:0)
如果您的表格是这样的,并且您的要求是这样的,那么您就在轨道上......
但是,如果检查最后一行与最后一行之间的第二个差异,则会更好。这将让您了解有多少第二个用户有PAUSED或Play the TRACK。
INSERT INTO table (timestamp, action, timePassed)
SELECT now(), 'pause', SECOND(timediff(now(), timestamp))
FROM table
WHERE ID = (Select Max(ID) from Table)
根据需要执行操作,以便在两者之间插入时差。
答案 2 :(得分:0)
我建议不要明确地存储timePassed
,因为通过拥有每个事件的时间戳,您已经存储了每个间隔一次。如果您单独存储timePassed
,则您将在多个位置存储相同的数据。引用E. F. Codd,"如果某些事情是真的,说两次并不能使它更加真实。"此外,当您多次存储相同的内容时,您将更新异常。
如果要使用查询计算间隔,可能会有效。
SELECT event.id,
event.timestamp,
event.action,
TIME_TO_SEC(TIMEDIFF(event.timestamp, start_event.timestamp)) time_passed
FROM event
JOIN (SELECT timestamp
FROM event
WHERE event.action = 'start') start_event ON 1 = 1