代码之家  ›  专栏  ›  技术社区  ›  Andrew Ibbo Ibbitson

PHP SQL解决轮流访问之间的差距

  •  1
  • Andrew Ibbo Ibbitson  · 技术社区  · 12 年前

    我在写这段代码时遇到了一个小问题。我有一个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
    

    我需要找出通话之间的差距。即 etime 第1行AND stime 第2行。答案应该是5。 我可以使用PHP轻松地计算出差异,但无法计算出如何获得: 埃蒂姆 从第1行开始 刺激,刺激 从第2行开始,然后 埃蒂姆 从第2行和 刺激,刺激 从第3行等等……等等……我猜是某种交替函数,但不知道。

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

    我是这个网站的新手,我四处看看是否有人问过这个问题。如果有,我道歉。 感谢任何能帮忙的人。

    编辑:@sean为我回答了这个问题,除了 身份证件 结果必须是连续的。我需要知道如何做 LEFT JOIN 具有非连续性 身份证件

    2 回复  |  直到 12 年前
        1
  •  0
  •   Sean    12 年前

    使用 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 定期的加薪

        2
  •  0
  •   Andrew Ibbo Ibbitson    12 年前

    好啊在肖恩和我的卢阿姨的帮助下,我已经解决了这个问题。我相信有一种更容易的方法。

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

    首先 CREATE 一个新的 table ( temp_gaps ),那么 SELECT 原始文件中的所需信息 桌子 ( 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 桌子和一切都很好。

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