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