【MySQL】查询是否连续5次失败
场所房间表
场所编号和房间号联合唯一, 一对多关系
场所编号关联商家ID,一对一关系
- CREATE TABLE `aisw_room` (
- `ID` int(11) NOT NULL AUTO_INCREMENT,
- `PLACE_CODE` varchar(20) DEFAULT NULL COMMENT '场所编号',
- `ROOM_NO` varchar(10) DEFAULT NULL COMMENT '房间号',
- `SSID` varchar(60) DEFAULT NULL COMMENT 'ssid',
- `SSID_PWD` varchar(60) DEFAULT NULL COMMENT 'WiFi密码',
- `ACCOUNT` varchar(50) DEFAULT NULL COMMENT '宽带账号',
- `LONGITUDE` varchar(10) DEFAULT NULL COMMENT '经度',
- `LATITUDE` varchar(10) DEFAULT NULL COMMENT '纬度',
- `PLACETYPEGATEWAY` varchar(10) DEFAULT NULL COMMENT '产品类型',
- `UPDATETIME` datetime DEFAULT NULL COMMENT '更新时间',
- `CREATETIME` datetime DEFAULT NULL COMMENT '创建时间',
- `TIMELINE` datetime DEFAULT NULL COMMENT '时间戳',
- `DEVICEMAC` varchar(32) DEFAULT NULL COMMENT '设备mac',
- `STATUS` tinyint(1) DEFAULT NULL COMMENT '状态(0-无效 1-有效)',
- `DEVICE_CODE` varchar(50) DEFAULT NULL COMMENT '设备编号(管综平台使用)',
- `GZ_ROOM_NO` varchar(10) DEFAULT NULL COMMENT '管综场所名称',
- PRIMARY KEY (`ID`) USING BTREE,
- KEY `IDX_ROOM_ROOMNO_CODE` (`ROOM_NO`,`PLACE_CODE`) USING BTREE
- ) ENGINE=InnoDB AUTO_INCREMENT=2317 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='场所房间信息表';
扫码记录表
场所编号在这里不存值,按商家ID和房间号关联上面的房间表
是否连接成功根据 ISCONNECTION状态筛选
- CREATE TABLE `aisw_e_service_scan_history_msg` (
- `ID` int(11) NOT NULL AUTO_INCREMENT,
- `MERCHANT_ID` int(11) DEFAULT NULL COMMENT '商家ID',
- `SERVICE_TYPE` varchar(50) DEFAULT NULL COMMENT '服务类型(与字典表AISW_MERCHANT_DICT表关联)',
- `USER_ID` int(11) DEFAULT NULL COMMENT '用户ID(与AISW_USER表关联)',
- `WEIXINID` varchar(100) DEFAULT NULL COMMENT '微信ID',
- `PHONENUM` varchar(20) DEFAULT NULL COMMENT '手机号',
- `PLACECODE` varchar(20) DEFAULT NULL COMMENT '场所编号',
- `ROOMNO` varchar(10) DEFAULT NULL COMMENT '房间号',
- `ACCEPT_STATUS` tinyint(1) DEFAULT '0' COMMENT '受理状态(0-未受理 1-已受理)',
- `CREATETIME` datetime DEFAULT NULL COMMENT '创建时间',
- `UPDATETIME` datetime DEFAULT NULL COMMENT '更新时间',
- `TIMELINE` datetime DEFAULT NULL COMMENT '时间戳',
- `LONGITUDE` varchar(10) DEFAULT NULL COMMENT '经度',
- `LATITUDE` varchar(10) DEFAULT NULL COMMENT '纬度',
- `ACTIVETYPE` tinyint(1) DEFAULT NULL COMMENT '获取方式:1.扫码;2搜索公众号(字段已废弃)',
- `ISCONNECTION` tinyint(1) NOT NULL COMMENT '是否连接WiFi:0.未连接;1.连接',
- `LOCALATITUDE` varchar(20) DEFAULT NULL COMMENT '当前扫码维度',
- `LOCALONGITUDE` varchar(20) DEFAULT NULL COMMENT '当前扫码经度',
- `ISSENTAREA` tinyint(1) NOT NULL COMMENT '数据是否对区域发送过:0.未发送;1.成功返回;-1失败返回',
- `ISSENTCITY` tinyint(1) NOT NULL COMMENT '数据是否对市级发送过:0.未发送;1.成功返回;-1失败返回',
- `CONNECT_ERR_MSG` varchar(50) DEFAULT NULL COMMENT 'WIFI连接失败错误信息描述',
- `CREATE_BY` varchar(50) DEFAULT NULL COMMENT '创建人',
- PRIMARY KEY (`ID`) USING BTREE,
- KEY `IDX_TE_SCAN_HISTORY_PHONENUM` (`PHONENUM`) USING BTREE,
- KEY `IDX_TE_SCAN_HISTORY_WXID` (`WEIXINID`) USING BTREE,
- KEY `IDX_E_S_SCAN_M_ID` (`MERCHANT_ID`)
- ) ENGINE=InnoDB AUTO_INCREMENT=600 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='连接wifi服务通知表';
我是想按扫码记录的创建时间倒序排序,筛选对应的房间的前五条记录,
如果都为未连接的状态,说明符合连续5次扫码失败的记录
所以这是最开始的SQL
- SELECT *
- FROM aisw_e_service_scan_history_msg
- WHERE roomno = room.ROOM_NO AND merchant_id = merchant.ID
ORDER BY CREATETIME DESC
LIMIT 5
然后为了只获取【是,否】的状态,又做了一层子查询
对上面的结果集按连接状态进行分组,如果COUNT函数计数连接失败的个数为5,则SELECT 1,否则为0
- SELECT IF( COUNT(ISCONNECTION = 0) = 5, 1, 0)
- FROM (
- SELECT *
- FROM aisw_e_service_scan_history_msg
- WHERE roomno = 701 AND merchant_id = 4
- ORDER BY CREATETIME DESC
- LIMIT 5
- ) AS recent
- GROUP BY ISCONNECTION;
- +----------------------------------------+
- | IF( COUNT(ISCONNECTION = 0) = 5, 1, 0) |
- +----------------------------------------+
- | 1 |
- +----------------------------------------+
- 1 row in set (0.05 sec)
我想直接把这个子查询放入主查询里面,作为一个字段子查询
但是发现这样嵌套了之后不能把主查询的表字段作为条件提供给里面嵌套的查询
执行结果会报错,说不知道条件来自哪里
- SELECT
- room.ID,
- merchant.ID AS MERCHANT_ID,
- (
- SELECT IF( COUNT(ISCONNECTION = 0) = 5, 1, 0)
- FROM (
- SELECT *
- FROM aisw_e_service_scan_history_msg
- WHERE roomno = room.ROOM_NO AND merchant_id = merchant.ID
- ORDER BY CREATETIME DESC
- LIMIT 5
- ) AS recent
- GROUP BY ISCONNECTION
- ) AS record,
- room.PLACE_CODE,
- room.ROOM_NO,
- room.SSID,
- room.SSID_PWD,
- room.ACCOUNT,
- room.LONGITUDE,
- room.LATITUDE,
- room.PLACETYPEGATEWAY,
- room.UPDATETIME,
- room.CREATETIME,
- room.TIMELINE,
- room.DEVICEMAC,
- room.STATUS,
- room.DEVICE_CODE,
- room.GZ_ROOM_NO
- FROM
- aisw_room AS room
- JOIN aisw_merchant AS merchant ON room.PLACE_CODE = merchant.PLACE_CODE
- WHERE
- room.PLACE_CODE = 36212521169073
- AND room.STATUS = 1
- ORDER BY
- CREATETIME DESC
- > 1054 - Unknown column 'room.ROOM_NO' in 'where clause'
- > 时间: 0s
然后纠结了很久,就想到用GROUP_CONCAT函数来实现
对这个房间的扫码记录进行分组拼接,合并每个记录的连接状态
- SELECT GROUP_CONCAT(ISCONNECTION)
- FROM aisw_e_service_scan_history_msg
- WHERE roomno = 701 AND merchant_id = 4
如果要做 JOIN查询,可以先按 商家ID和房号分组
- SELECT merchant_id, roomno, GROUP_CONCAT(ISCONNECTION)
- FROM aisw_e_service_scan_history_msg
- GROUP BY merchant_id, roomno
把最新创建的记录放前面排序,这样就能看到前五次的情况
- SELECT GROUP_CONCAT(ISCONNECTION ORDER BY CREATETIME DESC)
- FROM aisw_e_service_scan_history_msg
- WHERE roomno = 701 AND merchant_id = 4;
- +---------------------------------------------------------------------------------------------------------------------------------------+
- | GROUP_CONCAT(ISCONNECTION ORDER BY CREATETIME DESC) |
- +---------------------------------------------------------------------------------------------------------------------------------------+
- | 0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0 |
- +---------------------------------------------------------------------------------------------------------------------------------------+
- 1 row in set (0.03 sec)
然后使用LEFT截取字符 加上 IF字符匹配判断,就能获取需要的结果了
- SELECT
- merchant_id,
- roomno,
- IF('0,0,0,0,0' = LEFT( GROUP_CONCAT(ISCONNECTION), 9), 1, 0) AS res
- FROM aisw_e_service_scan_history_msg
- GROUP BY merchant_id, roomno;
- +-------------+--------+-----+
- | merchant_id | roomno | res |
- +-------------+--------+-----+
- | 1 | 102 | 0 |
- | 3 | 120 | 0 |
- | 4 | 701 | 1 |
- | 4 | 705 | 0 |
- +-------------+--------+-----+
- 4 rows in set (0.04 sec)
我暂时没用JOIN来写,用字段子查询来完成
下面还附加了一个【最近一个月扫码记录的查询】
- SELECT
- room.ID,
- merchant.ID AS MERCHANT_ID,
- (
- SELECT IF ('0,0,0,0,0' = LEFT(GROUP_CONCAT(ISCONNECTION ORDER BY CREATETIME DESC), 9), 1, 0) AS res
- FROM aisw_e_service_scan_history_msg
- WHERE roomno = room.ROOM_NO AND merchant_id = merchant.ID
- ) AS res,
- (
- SELECT COUNT(1) AS record
- FROM aisw_e_service_scan_history_msg
- WHERE roomno = room.ROOM_NO AND merchant_id = merchant.ID AND CREATETIME >= DATE_SUB( NOW(), INTERVAL 1 MONTH)
- ) AS record,
- room.PLACE_CODE,
- room.ROOM_NO,
- room.SSID,
- room.SSID_PWD,
- room.ACCOUNT,
- room.LONGITUDE,
- room.LATITUDE,
- room.PLACETYPEGATEWAY,
- room.UPDATETIME,
- room.CREATETIME,
- room.TIMELINE,
- room.DEVICEMAC,
- room.STATUS,
- room.DEVICE_CODE,
- room.GZ_ROOM_NO
- FROM
- aisw_room AS room
- JOIN aisw_merchant AS merchant ON room.PLACE_CODE = merchant.PLACE_CODE
- WHERE
- room.PLACE_CODE = 36212521169073
- AND room.STATUS = 1
- ORDER BY
- CREATETIME DESC
【MySQL】查询是否连续5次失败的更多相关文章
- MySQL查询显示连续的结果
#mysql中 对于查询结果只显示n条连续行的问题# 在领扣上碰到的一个题目:求满足条件的连续3行结果的显示 X city built a new stadium, each day many peo ...
- mysql查询之 连续出现的数字,重复出现的邮箱,删除重复的电子邮箱
1.编写一个 SQL 查询,查找所有至少连续出现三次的数字. +----+-----+ | Id | Num | +----+-----+ | 1 | 1 | | 2 | 1 | | 3 | 1 | ...
- MySql查询进阶
1.1 as关键字 用于 给显示结果中字段 或者 表 起别名 select 别名.字段名 from 表名 as 别名 where 条件语句 # 对字段起别名 select id as '编号', na ...
- Swoole 实战:MySQL 查询器的实现(协程连接池版)
目录 需求分析 使用示例 模块设计 UML 类图 入口 事务 连接池 连接 查询器的组装 总结 需求分析 本篇我们将通过 Swoole 实现一个自带连接池的 MySQL 查询器: 支持通过链式调用构造 ...
- mysql查询进程、导入数据包大小设置
mysql查询进程.导入数据包大小设置 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-12-27 查询正在执行的进程: ...
- MySQL查询不使用索引汇总 + 如何优化sql语句
不使用索引原文 : http://itlab.idcquan.com/linux/MYSQL/918330.html MySQL查询不使用索引汇总 众所周知,增加索引是提高查询速度的有效途径,但是很多 ...
- 十二、MySQL 查询数据
MySQL 查询数据 MySQL 数据库使用SQL SELECT语句来查询数据. 你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据. 语法 以下为在MyS ...
- php----处理从mysql查询返回的数据
使用php的mysql,向mysql查询,返回的是一个资源,有4个函数可以进行处理. 1.mysql_fetch_row() 2.mysql_fetch_assoc() 3.mysql_fetch_a ...
- mysql查询相关的命令解析
特:不重启mysql 更新配置文件方法(不允许重启mysql实例或连接不上msyql服务器): gdb -p $(pidof mysqld) -ex "set max_connections ...
- 一个诡异的MySQL查询超时问题,居然隐藏着存在了两年的BUG
这一周线上碰到一个诡异的BUG. 线上有个定时任务,这个任务需要查询一个表几天范围内的一些数据做一些处理,每隔十分钟执行一次,直至成功. 通过日志发现,从凌晨5:26分开始到5:56任务执行了三次,三 ...
随机推荐
- 微信小程序跳转重新加载目标页
可用于在首次进入到小程序后就执行性了首页的onLoad方法,等你再去点击其它页面再回来的时候就不会加载onLoad了,比如你跳到登录页后再返回到首页会发现首页啥数据都没加载,所以你在登录那边进行跳转的 ...
- (C#) IIS 响应标头过滤敏感信息(如:Server/X-Powered-By等) 运维知识
背景: 再一次净网行动中,客户要求安全改造发现了接口请求的header标头中出现如图中的敏感信息. 说明: 其意义在于告知浏网站是用什么语言或者框架编写的.解决办法就是修改该响应头为一个错误的值,将攻 ...
- 关于 CSDN 的恶臭嘴脸
我有段时间确实希望通过 CSDN 增加我文章的阅读量.但是我怎么使用 CSDN,我想要的大概也就 cnblogs 相对符合预期,CSDN 真是垃圾. 为了钱真是什么都不要了,让我们这种没有自主经济来源 ...
- kettle从入门到精通 第十七课 kettle Transformation executor
Transformation executor步骤是一个流程控件,和映射控件类似却又不一样. 1.子转换需要配合使用从结果获取记录和复制记录到结果两个步骤,而子映射需要配合映射输入规范和映射输出规范使 ...
- 《Android开发卷——设置圆形头像,Android截取圆形图片》
在有一些程序开发中,有时候会用到圆形,截取一张图片的一部分圆形,作为头像或者其他. 本实例就是截图圆形,设置头像的. 首先讲解一些代码 <ImageView android:id=&q ...
- 一种复习flex布局的方法
方法论 flex布局有多个属性,时常会忘记.我们复习的话,单纯看一些博客文章,不能直观的理解,也比较枯燥. 因此如果有一种用写代码闯关的方式来复习(学习)flex布局,那也许会更有意思. FLEXBO ...
- 【大道至简】NetCore3.1快速开发框架一:介绍
新的一年开始,祝大家2020新年快乐! 去年开源了一个基于NetCore2.2的框架,好多好基友还是比较喜欢的 github地址:https://github.com/feiyit/FytSoaCms ...
- redis锁定商品解决并发售卖问题 RedisUtil工具类
redis锁定商品解决并发售卖问题 RedisUtil工具类 redis数据类型介绍: //伪代码,基本思路 //1.出redis,每次在选定商品之后,先检查redis是否已经锁定该商品,避免超卖.S ...
- Linux chmod -bash: ./xx.sh: Permission denied的解决方案
Linux -bash: ./xx.sh: Permission denied的解决方案启动tomcat命令:./startup.sh之后提示-bash: ./startup.sh: Permissi ...
- const 和 volatile 指针
关键字 const 和 volatile 规定了指针的处理方式: const 规定指针在初始化后是受保护的,不能够再修改. volatile 规定了变量的值能够被用户应用程序外部的操作所修改. 因此, ...