确定日期范围是否包含在MySQL中的另一个范围中

确定日期范围是否包含在MySQL中的另一个范围中,mysql,sql,Mysql,Sql,我正在寻找一种干净的方法,而不是3..n交叉联接,只是想知道是否可以在sql中实现,如果不可以,我将寻求另一种解决方案。 将使用数字而不是日期来简化 我有n行,其中包含n个任务和n个项目 task item start end 1 1 1 5 1 2 2 6 1 3 0 4 1 4 8 10 在这种情况下,我希望使用minstart maxend来显示重

我正在寻找一种干净的方法,而不是3..n交叉联接,只是想知道是否可以在sql中实现,如果不可以,我将寻求另一种解决方案。 将使用数字而不是日期来简化 我有n行,其中包含n个任务和n个项目

 task  item   start end
    1     1      1     5
    1     2      2     6
    1     3      0     4
    1     4      8    10
在这种情况下,我希望使用minstart maxend来显示重叠日期,因此结果将是:

task   item  start end
   1   1,2,3     0    6
   1       4     8   10
有没有关于如何在sql中解决它的想法?这就像是一个挑战,如果不能这样做,我会去python


谢谢

这类似于我回答的问题,以及类似的数据孤岛问题。然而,在你的情况下,这更为复杂,因为岛屿的识别将需要根据不仅仅是之前的记录来计算

它最终会看起来像这样:

SET @iEnd = -1; /* init value should be something you don't expect to see */
SET @task = -1; /* init value should be something you don't expect to see */
SET @isNewIsland = 0 /* init value doesn't actually matter */;
SET @i = 0;

SELECT islandNum
   , GROUP_CONCAT(item ORDER BY item) AS items
   , MIN(start) AS iStart
   , MAX(end) AS iEnd
FROM (
    SELECT @isNewIsland := IF(@task <> task OR start > @iEnd, 1, 0)
       , @task := task, item, start, end
       , @i := IF(@isNewIsland = 1, @i + 1, @i) AS islandNum
       , @end := IF(@isNewIsland = 1, end, GREATEST(end, @iEnd))
    FROM ( /* Session(@) variables evaluation can be a bit unpredictable
              the subquery helps guarantee ordering before evaluation */
        SELECT task, item, start, end
        FROM theTable
        ORDER BY task, start, end
    ) AS subQ
) AS subQ 2
有些人不喜欢使用单独的、前面的SET语句;为了避免这种需要,将AS subQ替换为
作为subQ,选择@iEnd:=-1、@task:=-1、@isNewIsland:=0、@i:=0作为sInit

以干净的方式执行此操作。这是指什么?你的实际问题是什么?如果你编辑你的问题,包括CREATETABLE和insert语句,你会得到更多的帮助。也使用日期。无论如何,我更喜欢python的想法