php - MySQL:获取具有连续日期的行

标签 php mysql

例如:

    id | date
   ---+------------
    1 | 2011-01-01
    2 | 2011-01-02
    3 | 2011-01-15
    4 | 2011-01-20
    5 | 2011-01-10
    6 | 2011-01-30
    7 | 2011-01-03
    8 | 2011-02-09
    9 | 2011-02-10
    10 | 2011-02-11
    11 | 2011-02-12
    12 | 2011-02-15
    13 | 2011-02-19
    14 | 2011-02-21
    15 | 2011-02-22
    16 | 2011-02-23
    17 | 2011-02-24

例如,这里有一些行(日期现在可能总是按顺序排列)。 可能出现同一日期的多个记录。我想获取具有连续日期的行。例如;对于以上条目,我想要类似的东西:

   id | date
   ---+------------
    1 | 2011-01-01
    2 | 2011-01-02
    7 | 2011-01-03
    8 | 2011-02-09
    9 | 2011-02-10
    10 | 2011-02-11
    11 | 2011-02-12
    14 | 2011-02-21
    15 | 2011-02-22
    16 | 2011-02-23
    17 | 2011-02-24

我试过类似的方法:

SELECT a.id, a.date FROM tbl a
LEFT JOIN tbl b on a.user_id = b.user_id AND a.date = b.date + INTERVAL 1 DAY

但它没有给我正确的结果,而且速度也慢得多。所以请指导我一些正确的过程并且更快。

注意:它实际上是一个考勤计划,所以多个用户应该有相同日期的记录。所以我需要所有用户的所有具有连续日期的记录。

最佳答案

首先在日期列上创建索引:

create index idx_tbl_date on tbl(date);

然后,我认为以下将做你想做的事:

select t.*
from tbl t
where exists (select 1 from tbl t2 where t2.date = t.date + interval 1 day) or
      exists (select 1 from tbl t2 where t2.date = t.date - interval 1 day);

这两个 exists 子句确保您获得序列中的第一个和最后一个日期。使用索引,这应该表现良好。

关于php - MySQL:获取具有连续日期的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28608533/

相关文章:

php - 在php中处理带有条件的链接

php curl 错误 : Failure when receiving data from the peer

php - UTF8 读取波斯字符串为 ?在 MySQL 5.0 中

PHP:防止直接访问页面

php - Mysql中根据列值和group by进行减法

php - 在服务器(PHP)上存储文件的可扩展方式?

MySQL:使用外键引用连接字段

javascript - 如何防止在移动 View 中截取网页?

java - clojure 中的 MySQL 枚举数据类型访问

php - 使用while循环从另一个表获取总行数时MYSQL慢查询