Php MySQL-插入的一行和当前行之间的时间差
所以我有一个MySQL表,看起来像这样:Php MySQL-插入的一行和当前行之间的时间差,php,mysql,Php,Mysql,所以我有一个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 201
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计算该“暂停”行和“开始”行之间的秒差…然后用时间传递的结果更新“暂停”行
我的问题是是否有更好的方法来实现这一点(即使用timediff或其他一些MySQL命令)。问题是“暂停”时间戳在我插入之前是不存在的,所以我觉得在我进行任何计算之前需要先进行暂停
我能想到的唯一方法是插入一个新的“暂停”行
输入数据库,以便生成时间戳…然后查询
数据库中的“暂停”行的时间戳…计算
“暂停”行和“开始”行之间的秒差
使用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.
由于检索“开始”行所需的时间,这将引入时间偏差(但对于操作上的索引(如果行非常大,可能是时间戳),该时间应该可以忽略不计)
我能想到的唯一方法是插入一个新的“暂停”行
输入数据库,以便生成时间戳…然后查询
数据库中的“暂停”行的时间戳…计算
“暂停”行和“开始”行之间的秒差
使用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.
由于检索“开始”行所需的时间,这将导致时间上的偏差(但如果索引处于活动状态(如果行非常大,可能是时间戳),则该时间应该可以忽略不计)。如果您的表是这样的,并且您的需求是这样的,那么您就走上了正轨 但是,如果检查最后一行和最后一行之间的第二个差异,则更好。这将让您了解有多少第二个用户暂停或播放了该曲目
INSERT INTO table (timestamp, action, timePassed)
SELECT now(), 'pause', SECOND(timediff(now(), timestamp))
FROM table
WHERE ID = (Select Max(ID) from Table)
你想怎么做就怎么做,这样你就可以在两者之间插入时差。如果你的表是这样的,你的要求是这样的,那么你就走上正轨了 但是,如果检查最后一行和最后一行之间的第二个差异,则更好。这将让您了解有多少第二个用户暂停或播放了该曲目
INSERT INTO table (timestamp, action, timePassed)
SELECT now(), 'pause', SECOND(timediff(now(), timestamp))
FROM table
WHERE ID = (Select Max(ID) from Table)
根据需要执行操作,这样就可以在两个事件之间插入时差。我建议不要显式存储
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
我建议不要显式地存储
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
是的,那是我的问题。插入和更新都是必需的。或者可以使用一些timediff-MySQL命令在一次插入中完成所有操作吗?您说的第二个命令:-)-更新了答案。当然你需要一个语句,但是这个语句是双重选择一个值并插入新的…啊,对不起,我最初关于时差的想法在很多方面都是错误的。再次编辑:-(是的,这是我的问题。插入和更新都是必要的。或者可以用一些timediff MySQL命令在一次插入中完成所有操作吗?你说的第二个:-)-更新了答案。当然你需要一个语句,但是这个语句是双重选择一个值并插入新的…啊,对不起,我最初关于时差的想法在很多方面都是错误的。再次编辑:-(为什么要存储
timePassed
?在我看来,您似乎不需要这样做。任何两个操作之间的间隔仅通过每个时间戳就已经存储了一次。通过在多个位置存储相同的内容,您将面临更新异常(例如,当实际间隔为50时,timePassed
存储为30)。我建议在查询或视图中计算时间间隔。只要我是规范化警察,我想我也会建议您有一个单独的操作
表,每个可能的操作只有一个不同的值,然后在此表中有一个操作id
外键。为什么要存储timePassed
完全没有?在我看来,您似乎不需要这样做。任何两个操作之间的间隔都已经通过每个时间戳存储了一次。通过在多个位置存储相同的内容,您可能会出现更新异常(例如,当实际间隔为50时,timePassed
存储为30)。我建议在查询或视图中计算间隔。只要我是规范化警察,我想我还建议您有一个单独的操作表,每个可能的操作只有一个不同的值,然后是