我在解决如何编写此代码方面遇到了一个小问题。我有一个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
结果必须是连续的。我需要了解如何使用非连续LEFT JOIN
进行id
答案 0 :(得分:0)
使用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
增量中没有间隙。
答案 1 :(得分:0)
确定!在@Sean和我的Auntie Lou:D的帮助下,我已经解决了这个问题。我确信有一种更简单的方法可以做到这一点。
我决定创建一个新表并将所需信息复制到其中并生成新的id。因为我只在一个小型数据库上工作,所以我并不担心开销。
首先CREATE
新table
(temp_gaps
),然后SELECT
原始table
(placements
)所需的信息,不包括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
表,一切都很好。
感谢Sean向我发送了正确的方向。