mysql查询连续记录

案例:

最近遇到一个业务需求, 需要查找满足条件且连续3出现条以上的记录。

表结构:
CREATE TABLE `cdb_labels` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `type` int(11) NOT NULL DEFAULT '0' COMMENT '标签类型:1喜欢异性类型,2擅长话题',
  `content` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL COMMENT '标签内容',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=57 DEFAULT CHARSET=utf8 COMMENT='标签内容';

所有数据: SELECT * FROM cdb_labels WHERE type = 1;
这里写图片描述

解决思路:

1. 对满足初次查询的数据赋予一个自增列b :
 select id,type,content,(@b:=@b+1) as b from cdb_labels a,(SELECT @b := 0) tmp_b where type=1;

这里写图片描述

2、用自增的id减去自增列b:
select id,type,content,( id-(@b:=@b+1) ) as c from cdb_labels a,(SELECT @b := 0) tmp_b where type=1;

这里写图片描述

3、对等差列c分组, 并将分组的id组装起来:
select count(id),GROUP_CONCAT(id) from ( 
    select id,( id-(@b:=@b+1) ) as c from cdb_labels a,(SELECT @b := 0) tmp_b where type=1 
) as d GROUP BY c;

这里写图片描述

注:为了方便区分,这里查询分组成员要大于5(也就是连续出现超过5次的记录):

select if( count(id)>5 ,GROUP_CONCAT(id),null) e from ( 
    select id,( id-(@b:=@b+1) ) as c from cdb_labels a,(SELECT @b := 0) tmp_b where type=1 
) as d GROUP BY c;

那么得到的数据只有:9,10,11,12,13,14,15

这里写图片描述

4、根据组装的id去找数据:
select id,type,content from cdb_labels,(

    select if( count(id)>5 ,GROUP_CONCAT(id),null) e from ( 
        select id,( id-(@b:=@b+1) ) as c from cdb_labels a,(SELECT @b := 0) tmp_b where type=1 
    ) as d GROUP BY c

) as f where f.e is not null and FIND_IN_SET(id , f.e);

这里写图片描述

总结建议:

  1. MySQL的函数例如: GROUP_CONCAT() 的字符长度有限制(默认1024),如果连续记录较多会发生字符截取报错;
  2. 建议可以分步骤去查询,防止嵌套子查询,还可以提升性能而且避免使用MySQL函数;
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
m_trafficLight.SetSize(50, 150); return TRUE; } void CTrafficLightDemoDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); SendMessage(WM_ICONERASEBKGND, reinterpret_cast如果您想查询某个时间段内连续的时间,可以使用 MySQL 中的 DATEDIFF 函数和子查询来实现<WPARAM>(dc.GetSafeHdc()), 0); // 绘制图标 HICON hIcon = (HICON)。 假设您要查询在某个日期范围内连续的时间段,可以按照以下步骤进行: 1.LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, GetSystemMetrics(SM_CXICON), GetSystem 使用 DATEDIFF 函数计算相邻两个时间之间的天数差值。 2. 使用子查询筛选出相Metrics(SM_CYICON), 0); if (hIcon) { dc.DrawIcon((m_trafficLight.m_width * 邻两个时间之间的天数差值为 1 的记录。 3. 使用 GROUP BY 和 COUNT 函数得到连续3) / 2, (m_trafficLight.m_height * 5) / 2, hIcon); } } else时间段的数量。 以下是一个示例 SQL 查询语句: ``` SELECT COUNT(*) AS continuous_days FROM ( SELECT t { CPaintDC dc(this); m_trafficLight.Draw(dc.GetSafeHdc()); } } HCURSOR CTra1.date, DATEDIFF(t1.date, t2.date) AS diff FROM your_table t1 INNER JOIN your_tablefficLightDemoDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CTraffic t2 ON t1.date > t2.date WHERE t1.date BETWEEN '2021-01-01' AND '2021LightDemoDlg::OnBnClickedStartButton() { m_trafficLight.Start(); } ``` 最后,我们需要创建一个M-01-31' ) AS temp WHERE temp.diff = 1; ``` 请将上述查询语句中的 `yourFC应用程序,并将TrafficLight类的头文件和源文件添加到项目中。在MFC应用程序中,我们_table` 修改为您要查询的表名,`date` 修改为您要查询的日期字段名,并将日期范围修改需要在资源文件中添加一个按钮,ID为IDC_START_BUTTON。我们还需要在资源文件中添加一个状态栏,为您要查询的范围。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值