mysql 一些有意思的sql语句,备忘
### 批量插入
```
INSERT INTO 表名 (字段列表) VALUES (字段对应的值),(字段对应的值),(字段对应的值),(字段对应的值),
```
js 代码示例:
```
function batchAddOrderRecords(recordArr, callBack) {
callBack = callBack == null ? nop : callBack;
const partSql = 'INSERT INTO shop_order ( order_id, goods_id, user_id, number_all, vip_level, batch_id ) VALUES ';
// 拼接各行的值
let partSql1 = '';
for (let i = 0; i < recordArr.length; i += 1) {
const one = recordArr[i];
partSql1 += `('${one.orderId}', ${one.goodsId}, ${one.userId}, ${one.numberAll}, ${one.vipLevel}, ${one.batchId})`;
if (i + 1 < recordArr.length) {
partSql1 += ',';
}
}
const sql = `${partSql} ${partSql1}`;
query(sql, (err, rows) => {
if (err) {
callBack(null);
} else {
callBack(rows.affectedRows > 0);
}
});
}
```
### 两个表组合,获得笛卡尔积
比如 商品表 + 玩家表,我需要获得 每个人对应所有商品的所有记录
```
SELECT a.*, b.* FROM shop_goods_config a, tbl_user_info b
```
### 承接上一个,找出所有vip用户,时间段内,尚未发出的权益列表
会员lv1,每月1次优先购。会员lv2,每月2次优先购
```
function getNotSendRightByTime(startTimeStr, endTimeStr, callBack) {
callBack = callBack == null ? nop : callBack;
const sql = `SELECT
alldata.*
FROM
(
// 这部分是获取 所有人应该分得的所有 商品权益记录
SELECT
a.goods_id,
b.user_id,
a.goods_name,
a.vip_level,
a.number,
a.loop_type,
b.user_name,
cast( AES_DECRYPT( FROM_BASE64 ( b.mobile ), 'jeo8lD320uu298wF' ) AS CHAR ) AS mobile
FROM
// 这里是组合两个表,10 * 10 = 100条记录
shop_goods_config a,
tbl_user_info b
WHERE
// 筛选 vip用户
b.vip_level > 0
// 筛选 只保留 比 玩家vip 等级低的商品记录
AND b.vip_level >= a.vip_level
) alldata
LEFT JOIN (
// 这部分是获取 玩家 本月已发放的记录
SELECT
user_id,
goods_id
FROM
shop_order
WHERE
user_id IN ( SELECT user_id FROM tbl_user_info WHERE vip_level > 0 )
AND vip_level > 0
// 限制月份
AND create_time >= '${startTimeStr}'
AND create_time <= '${endTimeStr}'
) senddata
// 这里是 玩家Id+商品Id,确认唯一记录
ON alldata.goods_id = senddata.goods_id AND alldata.user_id = senddata.user_id
WHERE
// 这里是 筛选 历史记录的,就是没发过的
senddata.user_id IS NULL;`;
query(sql, (err, rows) => {
if (err) {
callBack(null);
} else {
callBack(rows);
}
});
}
```
### 递归查找我的上级
表名: tbl_user_invite
我的邀请码字段: invite_code
我的上级邀请码字段: parent_invite_code
参数,就是我的邀请码 : aaaaaaaa
```
SELECT
lv,
user_id,
invite_code,
parent_invite_code
FROM
(
SELECT
@r AS _id,
@l := @l + 1 AS lv,
( SELECT @r := parent_invite_code FROM tbl_user_invite WHERE invite_code = _id LIMIT 1 ) AS parent_id
FROM
( SELECT @r := 'aaaaaaaa', @l := 0 ) vars,
tbl_user_invite h
) T1
JOIN tbl_user_invite T2 ON T1._id = T2.invite_code
GROUP BY
invite_code
ORDER BY
lv;
```
### 递归查找我的下级,各层级都有谁
表名: tbl_user_invite
我的邀请码字段: invite_code
我的上级邀请码字段: parent_invite_code
参数,就是我的邀请码 : aaaaaaaa
```
SELECT
@ids AS _ids,
( SELECT @ids := GROUP_CONCAT( invite_code ) FROM tbl_user_invite WHERE FIND_IN_SET( parent_invite_code, @ids ) ) AS cids,
@l := @l + 1 AS LEVEL
FROM
tbl_user_invite,
( SELECT @ids := 'aaaaaaaa', @l := 0 ) b
WHERE
@ids IS NOT NULL
```
### 查询记录时,把时间字段 格式化
```
SELECT
DATE_FORMAT( update_time, '%Y-%m-%d %H:%i:%s' ) AS create_time
FROM
tbl_user_info
```
### 汇总玩家战绩
count + if 根据条件统计条数
CASE WHEN 根据游戏类型,换算分数
TO_DAYS 筛选今天。但这个效率偏低,需要数据库试试去计算。 最好还是根据时间字符串,进行范围检索
```
SELECT
user_id AS userId,
user_name AS userName,
head_icon AS headIcon,
count( id ) AS gameCount,
count(IF( big_win = 1, 1, NULL )) AS bigWinCount,
IFNULL(sum(CASE
WHEN tab.game_type = 8
OR tab.game_type = 17
OR tab.game_type = 18
OR tab.game_type = 19
OR tab.game_type = 20
OR tab.game_type = 25
OR tab.game_type = 27
OR tab.game_type = 28
OR tab.game_type = 30
OR tab.game_type = 31
THEN
tab.score_win / 10
WHEN tab.game_type = 29
THEN
tab.score_win / 1000
ELSE tab.score_win
END),0) AS scoreAll
FROM
friends_circle_game_record_card tab
WHERE
TO_DAYS(now()) - TO_DAYS( create_time ) = 0
GROUP BY
user_id
```
### 查禁止同桌记录里边,是否有2个玩家的记录
表名: friends_circle_forbid_intab
字段:user_id_1, user_id_2, user_id_3, user_id_4
4个字段用于存放最多限制4个玩家不能出现在同一个桌子内
思路是两个玩家ID, 3025,1261813 再四个字段里边出现的次数,如果出现 2次,则表示该条记录中同时存在 两个玩家(前提是同一条记录,id不能重复)
```
SELECT count(*) as allCount from
(
SELECT
// 判断字段 是否出现 两个id,出现则为1
CASE WHEN user_id_1 = 3025 OR user_id_1 = 1261813 THEN 1 ELSE 0 END AS find_1,
CASE WHEN user_id_2 = 3025 OR user_id_2 = 1261813 THEN 1 ELSE 0 END AS find_2,
CASE WHEN user_id_3 = 3025 OR user_id_3 = 1261813 THEN 1 ELSE 0 END AS find_3,
CASE WHEN user_id_4 = 3025 OR user_id_4 = 1261813 THEN 1 ELSE 0 END AS find_4
FROM friends_circle_forbid_intab
) a
// 把四个字段判断的结果相加,看是否大于等于2
WHERE a.find_1 + a.find_2 + a.find_3 + a.find_4 >= 2;
```
### 接上条,根据一个玩家ID,清空记录里边 该玩家的id字段,以及信息字段
技巧就是通过 CASE WHEN THEN 来实现根据字段进行条件判定,并同时进行update操作的效果
```
UPDATE friends_circle_forbid_intab set
user_info_1 = case when user_id_1 = 3024 then '' else user_info_1 end,
user_info_2 = case when user_id_2 = 3024 then '' else user_info_2 end,
user_info_3 = case when user_id_3 = 3024 then '' else user_info_3 end,
user_info_4 = case when user_id_4 = 3024 then '' else user_info_4 end,
user_id_1 = case when user_id_1 = 3024 then 0 else user_id_1 end,
user_id_2 = case when user_id_2 = 3024 then 0 else user_id_2 end,
user_id_3 = case when user_id_3 = 3024 then 0 else user_id_3 end,
user_id_4 = case when user_id_4 = 3024 then 0 else user_id_4 end
where user_id_1 = 3024 or user_id_2 = 3024 or user_id_3 = 3024 or user_id_4 = 3024
```
### 存在更新,不存在插入
ON DUPLICATE KEY
设计表的时候,设计好 唯一 字段,就可以将 先判定记录是否存在,再插入/更新记录。变成一条sql完成所有
### 统计 积分表,按总分排名次,并 插入/更新 到 排行榜表
排行榜表:
tchl_game_score_rank
字段:
user_id, score, rank
分数表:
tchl_game_score
字段:
user_id, max_score
```
function createGameRank(callBack) {
callBack = callBack == null ? nop : callBack;
const sql = `INSERT INTO tchl_game_score_rank ( user_id, score, rank )
SELECT
a.user_id AS userId,
a.max_score AS score,
@rk := @rk + 1 AS rank
FROM
tchl_game_score a,
( SELECT @rk := 0 ) b
ORDER BY
a.max_score DESC,
a.user_id
ON DUPLICATE KEY UPDATE
user_id = VALUES( user_id ),
score = VALUES(score);`;
query(sql, (err, rows) => {
if (err) {
callBack(null);
} else {
callBack(rows.affectedRows > 0);
}
});
}
```
相关文章:
mysql 一些有意思的sql语句,备忘
### 批量插入 INSERT INTO 表名 (字段列表) VALUES (字段对应的值),(字段对应的值),(字段对应的值),(字段对应的值), js 代码示例: function batchAddOrde…...

hive自定义函数
hive自定义函数 hive内置的函数满足不了所有的业务需求,可以考虑自己定义函数 UDF:一对一输出(upper) UDTF:一对多输出 (lateral view explode) UDAF:多对一输出(count, max, min) 自定义UDF 用java实现一个UDF 引入依赖 …...

数仓理论【范式】【维度建模】
数仓理论 1 范式理论 1.1 范式概念 数据建模要遵循一定的规则,在关系建模中,这种规则就是范式 采用范式结构,可以有效的降低数据的冗余性 范式在获取数据时,需要通过join拼接出数据 范式有第一范式(1NF),第二范式…...

卷积神经网络
卷积神经网络1. 卷积神经网络边缘检测示例Padding卷积步长三维卷积单层卷积网络简单卷积网络示例池化层卷积神经网络示例2. 深度卷积网络经典网络残差网络残差网络为什么有用1 x 1 卷积谷歌Inception 网络介绍Inception 网络迁移学习数据扩充(数据增强)3…...
解决Qt提示xxx.so not found( using -rpath or -rpath-link)问题
问题描述: 在QtCreator中交叉编译的时候突然出现了以下动态库找不到的问题: 我这里是aarch64,其他环境类似即可。 /usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/bin/ld: warning: libwrap.so.0, needed by /home.../../nfsdir///libpulsecommo…...

Blazor 托管模型 BlazorWebAssembly和Blazor Server
BlazorWebAssembly 应用 BlazorWebAssembly 应用使用基于 WebAssembly 的 .NET 运行时在浏览器中直接执行。 BlazorWebAssembly 应用的工作方式类似于 Angular 和 React 等前端 JavaScript 框架。 但不是编写 JavaScript,而是编写 C#。 .NET 运行时与应用、应用程序…...

从未想过制作数据可视化展示竟可以如此简单
还在跟着网络上一节课好几个小时的付费课程学习如何制作数据可视化大屏嘛?还在为不知道怎么设计数据展示排版而苦恼?今天教大家用最简单的方式制作一个数据可视化大屏,首先让我们看一下参考大屏样式:接下来我们将制作数据可视化大…...

企业电子招投标采购系统源码之功能模块的描述
功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为外部供…...
LeetCode-2341. 数组能形成多少数对【哈希表,计数】
LeetCode-2341. 数组能形成多少数对【哈希表,计数】题目描述:解题思路一:哈希表,将数组中的数加入哈希表中,若有两个相同的数就记录下来,并消去两个。最后只需遍历哈希表中置为1的个数即可。解题思路二&…...

vue-echarts实现多功能图表
前言作为前端人员,日常图表、报表、地图的接触可谓相当频繁,今天小编隆重退出前端框架之VUE结合百度echart实现中国地图各种图表的展示与使用;作为“你值得拥有”专栏阶段性末篇,值得一看主要实现功能——中国地图——环形图——折…...
C#快键精灵
我发过挺多工作中用到的C#内容,整体链接和内容去这里看下:C#基础知识体系框架图,及起对应我发过的博客_花开莫与流年错_的博客-CSDN博客_c#架构图 可以记住电脑上鼠标、键盘操作记录,用处就很多,比较灵活了,…...

谷歌、微软、Meta?谁才是 Python 最大的金主?
你知道维护 Python 这个大规模的开源项目,每年需要多少资金吗? 答案是:约 200 万美元! PSF(Python 软件基金会)在 2022 年 6 月发布了 2021 的年度报告,其中披露了以下这份支出明细(…...
面向对象笔记
标准JavaBean类1.类名见名知意2.成员变量由private修饰3.提供两个构造方法 无参构造和带全部参数构造4.提供每一个成员变量对应的set/get方法5.如果有其它行为,也要写上空参构造 初始化默认值带参构造 初始化参数 创建对象由虚拟机调用,不能手动调用每创…...

tofu:一款功能强大的模块化Windows文件系统安全测试工具
关于tofu tofu是一款功能强大的针对Windows文件系统安全的模块化工具,该工具可以使用离线方法对目标Windows文件系统进行渗透测试,并通过绕过Windows系统登录界面来帮助广大研究人员测试Windows主机的安全性。除此之外,该工具还可以执行哈希…...

VS中scanf为什么会报错
简单来讲,scanf会强行输入内容,所以是不安全的。 我们来看这样的例子: #include <iostream> using namespace std;int main() {char demo[3];scanf("%s", demo);return 0; }对于以上代码,当我们输入字符不超过3时…...

使用kubeadm部署k8s1.24.0版本,遇到的坑总结
使用kubeadm部署k8s1.24.0版本,遇到的坑总结环境安装遇到的问题环境 操作系统:centos7 内核:5.4.231-1.el7.elrepo.x86_64 kubeadm:1.24.0 kubelet:1.24.0 kubectl:1.24.0 cri:docker cni&…...

【C++】特殊类设计
🌈欢迎来到C专栏~~特殊类设计 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句鸡汤&a…...
中创教育PMP如何轻松应对公司90%以上的沟通难题
掌握沟通技能,可以让问题从1变成0; 掌握沟通技能,可以让机会从0变成1; 掌握沟通技能,可以让成功从1变成100; 难题一、当领导问你某件事,但你又不太清楚时 【说话公式】需要思考需要确认晚点回…...

#笨鸟先飞# 数据结构与算法基础 课程笔记 第六章 图
图的定义和基本术语图:G( V , E ) Graph(Vertex,Edge)V:顶点(数据元素)的有穷非空集合;E:边的有穷集合。无向图:每条边都是无方向的有向图:每条边…...

深入浅出带你学习Apache中间件常见漏洞
前言 上一篇文章给大家总结了一下IIS中间件的漏洞,这篇文章就给大家讲一下apache中间件漏洞,说起apache大家一定不会陌生,这是我们日常中经常用到的中间件,下面由我来给大家讲解一下改中间件常见的漏洞。 Apache是什么ÿ…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...