我在研究如何编写此代码时遇到了一个小问题。 我有一个 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
一个新的table
(temp_gaps
),然后从原始table
(placements
)中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
桌子,一切都很好。
感谢肖恩把我送到正确的方向。