Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于多字段的MYSQL Groupby_Php_Mysql_Sql - Fatal编程技术网

Php 基于多字段的MYSQL Groupby

Php 基于多字段的MYSQL Groupby,php,mysql,sql,Php,Mysql,Sql,我有一个相当复杂的问题,我需要一些帮助 基本上,我的表有四个字段: Start Date, End Date, Item, Type 我还需要得到天数 为了正确地对它们进行分组,我需要查看每一行,并检查开始日期中的日期是否连续,如果它们是分组的,如果不是,则进入不同的组 因此,如果数据库中包含以下日期: 2013-10-23 2013-10-24 2013-10-28 2013-10-29 然后它应该返回两行 2(number of days), 2013-10-23 (startdat

我有一个相当复杂的问题,我需要一些帮助

基本上,我的表有四个字段:

Start Date,
End Date, 
Item, 
Type
我还需要得到天数

为了正确地对它们进行分组,我需要查看每一行,并检查开始日期中的日期是否连续,如果它们是分组的,如果不是,则进入不同的组

因此,如果数据库中包含以下日期:

2013-10-23
2013-10-24
2013-10-28
2013-10-29
然后它应该返回两行

2(number of days), 2013-10-23 (startdate) ,2013-10-24 (last consecutive date) , Item, Type
2,2013-10-28,2013-10-29,Item,Type
然后,为了使事情更复杂,分组需要基于同样的项目和类型

这就是下面的数据开始日期、项目、类型

2013-10-23,ABC,EFG
2013-10-24,XYZ,WXY
2013-10-28,ABC,EFG
2013-10-29,ABC,EFG
那么前两个将不会分组,因为项目和/或类型彼此不相同,即使日期是连续的

但是,最后两个会组合在一起,因为日期是连续的,项目和类型彼此相同,结果是:

number of days  startdate   last consecutive date  Item  Type
   1            2013-10-23  2013-10-23             ABC   EFG
   1            2013-10-24  2013-10-24             XYZ   WXY
   2            2013-10-28  2013-10-29             ABC   EFG
我正试图用MySQL实现这一点,我知道我可以借助PHP循环,但如果可能的话,最好用MySQL实现

下面是一个SQLFIDLE,其中包含一些数据

选择COUNT*、MINstartdate、MAXstartdate、item、type FROM 选择开始日期、项目、类型, @组:=@组+1- 类型@last_类型 和项目@最后一项 和起始日期@最后一天+间隔1天 G @最后的类型:=类型, @最后一项:=项, @最后日期:=开始日期 从productinfo, 选择@group:=0, @最后一种类型:=NULL, @最后一项:=NULL, @最后日期:=空 初始化 按类型、项目、起始日期排序的订单 g的t群 请在上查看。

尝试以下操作:

选择 DATEDIFFMAXstartdate,MINstartdate+1作为天数, MINstartdate作为起始日期, MAXstartdate作为最后一个连续日期, 项目 类型 从…起 选择@rownum:=@rownum+1作为行号, 圆周率* 从…起 productinfo pi, 选择@rownum:=0 r 我的数据 按项目、类型、日期添加开始日期、间隔-行数天分组 按项目、类型、日期添加开始日期、间隔-行数天排序 ; 根据安德烈·米恩的回答


SQLFIDLE:

你能在我已经添加了一个示例数据的基础上发布表结构吗,谢谢!这应该是相对容易的,只要在StartDate=StartDate+1的基础上进行连接,并且item和type字段是相同的。但是,您希望如何处理多个连续日期?另外,您要将计数分组的是什么?多个连续日期应与其他连续日期一起分组,因此,如果有3个连续日期,则应将它们全部分组在一起,只要项目和类型相同。是的,另一个是一个国家,这是一个缺口和岛屿问题。看到这个类似的问题:。你能告诉我它代表什么吗?@Akash:是空安全相等运算符。也就是说,它与=,不同的是,如果一个操作数为NULL,它的计算结果为FALSE;如果两个操作数都为NULL,它的计算结果为TRUE。谢谢你,这让我朝着正确的方向走去。我将发布我最终得到的实际查询,但这肯定足以帮助我完成它。非常感谢我自己的教育,select group:=0,last_type:-NULL,这部分只是为这些变量设置默认值?init单词在这里有意义吗?同样在顶部,group:=@group+1-,括号中的部分是比较,例如,它最终是1还是0?1如果找到匹配项0如果不匹配?我想我对它的其余部分很清楚,只是以前从未使用过这个方法,我想完全理解我在这里做什么。@CharlieSmith:是的,这是正确的-子查询正在初始化用户变量;init表别名没有特殊含义。如果表达式为真,括号中的布尔表达式将计算为1,如果表达式为假,则计算为0;因此@group+1-。。。如果表达式为true,则等于@group;如果表达式为false,则等于@group+1。如果你想在你的问题中没有提到的这种方式使用EdDATE,那么你也需要考虑如果周期重叠会发生什么。你是对的,我不完全清楚这一部分,如果是一个难以解释的问题。在这种特殊情况下,由于数据的原因,不会有任何重叠,但我可以看出,这当然需要考虑。再次感谢你的帮助。为什么stackoverflow强迫我在给出解决方案后等待x小时才能授予赏金?参见
SELECT DATEDIFF(max(enddate),min(startdate)) + 1 as days, MIN(startdate) as start, MAX(enddate) as end, type, item FROM (
  SELECT   startdate, enddate,item, type,
       @group     := @group + 1 - (
                       type      <=> @last_type
                   AND item      <=> @last_item
                   AND startdate <=> @last_date + INTERVAL 1 DAY
                     ) g,
       @last_type := type,
       @last_item := item,
       @last_date := enddate
  FROM     productinfo, (
         SELECT @group     := 0,
                @last_type := NULL,
                @last_item := NULL,
                @last_date := NULL
       ) init
  ORDER BY type, item, startdate
) t GROUP BY g order by start