Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL-插入的一行和当前行之间的时间差_Php_Mysql - Fatal编程技术网

Php 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

所以我有一个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计算该“暂停”行和“开始”行之间的秒差…然后用时间传递的结果更新“暂停”行

我的问题是是否有更好的方法来实现这一点(即使用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)。我建议在查询或视图中计算间隔。只要我是规范化警察,我想我还建议您有一个单独的
操作
表,每个可能的操作只有一个不同的值,然后是