PHP SQL 计算轮值访问之间的间隙


PHP SQL Working out gaps between visits on a rota

我在研究如何编写此代码时遇到了一个小问题。 我有一个 MySQL 查询,它返回轮班日期列表。返回的数据如下所示:

id |    date    |  stime   |  etime   | staff | client
------------------------------------------------------
1  | 2014-01-01 | 08:00:00 | 08:30:00 | Dave  | Mary
2  | 2014-01-01 | 08:35:00 | 09:05:00 | Dave  | Clive
3  | 2014-01-01 | 09:17:00 | 09:32:00 | Dave  | Joan
4  | 2014-01-01 | 09:38:00 | 10:08:00 | Dave  | Doris

我需要计算出呼叫之间的差距。 即第 1 行中的etime和第 2 行中的stime之间的差距。 答案应该是5。我可以使用 PHP 轻松计算出差异,但无法弄清楚如何获得: 第 1 行etime,第 2 行stime,第 2 行etime,第 3 行stime等......等等... 我猜是某种交替函数,但不知道。

我确实需要指出,id不会是连续的。

我是这个网站的新手,环顾四周,看看这个问题是否已经被问过。 如果有的话,我深表歉意。感谢任何可以提供帮助的人。

编辑:@sean已经为我回答了这个问题,除了id结果必须是连续的。 我需要了解如何使用非连续id进行LEFT JOIN

使用LEFT JOIN连接下一行stime。确保重命名t2.stime,使其不模棱两可。

SELECT t1.*, 
       t2.stime as `nxt_row_stime` 
FROM table t1 
LEFT JOIN table t2 
ON t2.id = t1.id+1

注意:这要求id增量中没有间隙。

好的! 我已经在@Sean和我的娄阿姨的帮助下解决了这个问题:D。 我相信有一种更简单的方法可以做到这一点。

我决定创建一个新表并将所需的信息复制到其中并生成新的 id。 由于我只在处理一个小数据库,所以我不担心开销。

首先CREATE一个新的tabletemp_gaps),然后从原始tableplacements)中SELECT所需的信息,不包括id列。 这会将数据从原始表复制到没有 ID 的新表。 新表将生成一个新的auto_increment ID,因此新表中的所有内容现在都按顺序排列:

CREATE TABLE temp_gaps 
(
  `id` mediumint(6) NOT NULL auto_increment,
  `date` date NOT NULL,
  `stime` time NOT NULL,
  `etime` time NOT NULL,
  `staff` varchar(50) NOT NULL,
  `client` varchar(50) NOT NULL,
  PRIMARY KEY  (`id`)
)
engine=memory AS 
  (SELECT date,stime,etime,staff,client 
   FROM   placements 
   ORDER  BY `staff`,`date`,`stime` ASC)

复制信息后@Sean我可以使用以前的答案来提取信息,left_join etime列,然后我可以在我的 PHP 脚本中处理数据结果。 一旦我完成,我只是drop桌子,一切都很好。

感谢肖恩把我送到正确的方向。