场所房间表

场所编号和房间号联合唯一, 一对多关系

场所编号关联商家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次失败的更多相关文章

  1. MySQL查询显示连续的结果

    #mysql中 对于查询结果只显示n条连续行的问题# 在领扣上碰到的一个题目:求满足条件的连续3行结果的显示 X city built a new stadium, each day many peo ...

  2. mysql查询之 连续出现的数字,重复出现的邮箱,删除重复的电子邮箱

    1.编写一个 SQL 查询,查找所有至少连续出现三次的数字. +----+-----+ | Id | Num | +----+-----+ | 1 | 1 | | 2 | 1 | | 3 | 1 | ...

  3. MySql查询进阶

    1.1 as关键字 用于 给显示结果中字段 或者 表 起别名 select 别名.字段名 from 表名 as 别名 where 条件语句 # 对字段起别名 select id as '编号', na ...

  4. Swoole 实战:MySQL 查询器的实现(协程连接池版)

    目录 需求分析 使用示例 模块设计 UML 类图 入口 事务 连接池 连接 查询器的组装 总结 需求分析 本篇我们将通过 Swoole 实现一个自带连接池的 MySQL 查询器: 支持通过链式调用构造 ...

  5. mysql查询进程、导入数据包大小设置

    mysql查询进程.导入数据包大小设置 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-12-27 查询正在执行的进程: ...

  6. MySQL查询不使用索引汇总 + 如何优化sql语句

    不使用索引原文 : http://itlab.idcquan.com/linux/MYSQL/918330.html MySQL查询不使用索引汇总 众所周知,增加索引是提高查询速度的有效途径,但是很多 ...

  7. 十二、MySQL 查询数据

    MySQL 查询数据 MySQL 数据库使用SQL SELECT语句来查询数据. 你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据. 语法 以下为在MyS ...

  8. php----处理从mysql查询返回的数据

    使用php的mysql,向mysql查询,返回的是一个资源,有4个函数可以进行处理. 1.mysql_fetch_row() 2.mysql_fetch_assoc() 3.mysql_fetch_a ...

  9. mysql查询相关的命令解析

    特:不重启mysql 更新配置文件方法(不允许重启mysql实例或连接不上msyql服务器): gdb -p $(pidof mysqld) -ex "set max_connections ...

  10. 一个诡异的MySQL查询超时问题,居然隐藏着存在了两年的BUG

    这一周线上碰到一个诡异的BUG. 线上有个定时任务,这个任务需要查询一个表几天范围内的一些数据做一些处理,每隔十分钟执行一次,直至成功. 通过日志发现,从凌晨5:26分开始到5:56任务执行了三次,三 ...

随机推荐

  1. 主成分分析(PCA)介绍

    目录 计算过程 投影分量计算 假设你有一家理发店,已经记录了过去一年中所有顾客的头发长度和发型偏好的数据.现在你想从这些数据中提取一些主要的信息,比如顾客最常选择的发型类型,以及不同发型之间的相关性等 ...

  2. 状态管理(redux)

    https://www.redux.org.cn/ 2013年 Facebook 提出了 Flux 架构的思想,引发了很多的实现.2015年,Redux 出现,将 Flux 与函数式编程结合一起,很短 ...

  3. 腾讯视频遇到“前设备播放4K可能引发卡顿等异常,建议降低清晰度”

    腾讯视频遇到"前设备播放4K可能引发卡顿等异常,建议降低清晰度". 解决方法: 在菜单-设置-播放设置-勾选"开启硬件加速"-应用,然后退出腾讯视频,重新打开腾 ...

  4. MySQL数据库开发(2)

    单表查询 单表查询即对单个表进行查询. 单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY fie ...

  5. SM4Utils加解密demo

    SM4Utils加解密demo package com.example.core.mydemo.sm4; import cn.org.bjca.utils.SM4Utils; public class ...

  6. C#开发的NoteNet桌面小贴士 - 开源研究系列文章 - 个人小作品

    十多年前编写过这个NoteNet小应用,不过当时用的是文本的保存方式,而且功能上也相对较多.这次重新编写这个小应用,用上新的技术和功能.现在先把源码发布出来,在另个系列的博文中( C#基于.net f ...

  7. MySQL Explain 关键字详解

    概述 explain 关键字可以模拟执行 sql 查询语句,输出执行计划,分析查询语句的执行性能 使用方式如下:explain + sql explain select * from t1 执行计划各 ...

  8. 原生js实现下拉框可输入

    js实现下拉框可输入 前言 众所周知,html默认的下拉框是无法输入值的,然后最新的办法是用datalist和输入框绑定,但是很多浏览器不支持.然后还有很多框架提供的下拉框都是可输入的.但是公司的项目 ...

  9. Android 7 默认声音/大小修改

    背景 客户机器默认的开机声音一直很大:客户觉得无法接受,需要改小点. 基于Android 7的代码 前言 一般主要通过系统层来进行修改. 在系统关于音频的有关代码中,定义了两个数组: 注意,这些代码根 ...

  10. arm linux 移植 curl

    背景 libcurl是一个跨平台的开源网络协议库,支持http, https, rtsp等多种协议 .libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, ...