如何在mysql表中查找连续间隔

如何在mysql表中查找连续间隔,mysql,Mysql,我有一张表,上面有字段:personId,date personId+日期是唯一的,不能有两条日期和personId相同的记录 问题是:如何创建将显示连续访问间隔的mySQL查询 +----------+------------+------------+-------+ | personId | dateStart | dateEnd | count | +----------+------------+------------+-------+ | 1 | 2020-0

我有一张表,上面有字段:personId,date

personId+日期是唯一的,不能有两条日期和personId相同的记录

问题是:如何创建将显示连续访问间隔的mySQL查询

+----------+------------+------------+-------+ | personId | dateStart | dateEnd | count | +----------+------------+------------+-------+ | 1 | 2020-05-04 | 2020-05-06 | 3 | | 1 | 2020-05-08 | 2020-05-09 | 2 | | 2 | 2020-05-03 | 2020-05-04 | 2 | | 2 | 2020-05-07 | 2020-05-07 | 1 | +----------+------------+------------+-------+ 我发现了一些类似的问题,但它们都有一些特殊的差异,所以我不知道如何将它们应用到我的案例中,希望能根据我的表结构给出一个示例

SELECT 
  pairs.person_id, 
  pairs.startDate, 
  pairs.endDate, 
  pairs.endDate - pairs.startDate + 1 as count 
FROM
(SELECT 
  t1.person_id, 
  t1.date as startDate, 
  MIN(t3.date) as endDate 
FROM visits as t1
   LEFT JOIN visits as t2 ON 
     t1.person_id = t2.person_id AND 
     t1.date - t2.date = 1
   LEFT JOIN visits as t3 ON 
     t1.person_id = t3.person_id AND 
     t1.date <= t3.date
     LEFT JOIN visits as t4 ON 
       t3.person_id = t4.person_id AND 
       t3.date - t4.date = -1
WHERE ISNULL(t2.date) AND ISNULL(t4.date)
GROUP BY t1.person_id, t1.date
) as pairs
说明:

1我们发现记录t1没有以前的日期t2

2让t1记录与没有下一个日期的t3记录合并

3从t1开始的每个日期,让我们找到从t3开始的最小值


就是这样

为什么2020-05-07和2020-05-07是连续的?他们是同一天同一排。@Barmar,只是因为。。。你有主键吗?@Mihai,personId+date是唯一的对那些试图帮助你的人礼貌一点也许是个好主意
SELECT 
  pairs.person_id, 
  pairs.startDate, 
  pairs.endDate, 
  pairs.endDate - pairs.startDate + 1 as count 
FROM
(SELECT 
  t1.person_id, 
  t1.date as startDate, 
  MIN(t3.date) as endDate 
FROM visits as t1
   LEFT JOIN visits as t2 ON 
     t1.person_id = t2.person_id AND 
     t1.date - t2.date = 1
   LEFT JOIN visits as t3 ON 
     t1.person_id = t3.person_id AND 
     t1.date <= t3.date
     LEFT JOIN visits as t4 ON 
       t3.person_id = t4.person_id AND 
       t3.date - t4.date = -1
WHERE ISNULL(t2.date) AND ISNULL(t4.date)
GROUP BY t1.person_id, t1.date
) as pairs