当前位置: 首页 > news >正文

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 表名 &#xff08;字段列表&#xff09; VALUES &#xff08;字段对应的值&#xff09;,&#xff08;字段对应的值&#xff09;,&#xff08;字段对应的值&#xff09;,&#xff08;字段对应的值&#xff09;, js 代码示例: function batchAddOrde…...

hive自定义函数

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

数仓理论【范式】【维度建模】

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

卷积神经网络

卷积神经网络1. 卷积神经网络边缘检测示例Padding卷积步长三维卷积单层卷积网络简单卷积网络示例池化层卷积神经网络示例2. 深度卷积网络经典网络残差网络残差网络为什么有用1 x 1 卷积谷歌Inception 网络介绍Inception 网络迁移学习数据扩充&#xff08;数据增强&#xff09;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&#xff0c;而是编写 C#。 .NET 运行时与应用、应用程序…...

从未想过制作数据可视化展示竟可以如此简单

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

企业电子招投标采购系统源码之功能模块的描述

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部供…...

LeetCode-2341. 数组能形成多少数对【哈希表,计数】

LeetCode-2341. 数组能形成多少数对【哈希表&#xff0c;计数】题目描述&#xff1a;解题思路一&#xff1a;哈希表&#xff0c;将数组中的数加入哈希表中&#xff0c;若有两个相同的数就记录下来&#xff0c;并消去两个。最后只需遍历哈希表中置为1的个数即可。解题思路二&…...

vue-echarts实现多功能图表

前言作为前端人员&#xff0c;日常图表、报表、地图的接触可谓相当频繁&#xff0c;今天小编隆重退出前端框架之VUE结合百度echart实现中国地图各种图表的展示与使用&#xff1b;作为“你值得拥有”专栏阶段性末篇&#xff0c;值得一看主要实现功能——中国地图——环形图——折…...

C#快键精灵

我发过挺多工作中用到的C#内容&#xff0c;整体链接和内容去这里看下&#xff1a;C#基础知识体系框架图&#xff0c;及起对应我发过的博客_花开莫与流年错_的博客-CSDN博客_c#架构图 可以记住电脑上鼠标、键盘操作记录&#xff0c;用处就很多&#xff0c;比较灵活了&#xff0c…...

谷歌、微软、Meta?谁才是 Python 最大的金主?

你知道维护 Python 这个大规模的开源项目&#xff0c;每年需要多少资金吗&#xff1f; 答案是&#xff1a;约 200 万美元&#xff01; PSF&#xff08;Python 软件基金会&#xff09;在 2022 年 6 月发布了 2021 的年度报告&#xff0c;其中披露了以下这份支出明细&#xff08…...

面向对象笔记

标准JavaBean类1.类名见名知意2.成员变量由private修饰3.提供两个构造方法 无参构造和带全部参数构造4.提供每一个成员变量对应的set/get方法5.如果有其它行为&#xff0c;也要写上空参构造 初始化默认值带参构造 初始化参数 创建对象由虚拟机调用&#xff0c;不能手动调用每创…...

tofu:一款功能强大的模块化Windows文件系统安全测试工具

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

VS中scanf为什么会报错

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

使用kubeadm部署k8s1.24.0版本,遇到的坑总结

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

【C++】特殊类设计

&#x1f308;欢迎来到C专栏~~特殊类设计 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&a…...

中创教育PMP如何轻松应对公司90%以上的沟通难题

掌握沟通技能&#xff0c;可以让问题从1变成0&#xff1b; 掌握沟通技能&#xff0c;可以让机会从0变成1&#xff1b; 掌握沟通技能&#xff0c;可以让成功从1变成100&#xff1b; 难题一、当领导问你某件事&#xff0c;但你又不太清楚时 【说话公式】需要思考需要确认晚点回…...

#笨鸟先飞# 数据结构与算法基础 课程笔记 第六章 图

图的定义和基本术语图&#xff1a;G( V , E ) Graph&#xff08;Vertex&#xff0c;Edge&#xff09;V&#xff1a;顶点&#xff08;数据元素&#xff09;的有穷非空集合&#xff1b;E&#xff1a;边的有穷集合。无向图&#xff1a;每条边都是无方向的有向图&#xff1a;每条边…...

深入浅出带你学习Apache中间件常见漏洞

前言 上一篇文章给大家总结了一下IIS中间件的漏洞&#xff0c;这篇文章就给大家讲一下apache中间件漏洞&#xff0c;说起apache大家一定不会陌生&#xff0c;这是我们日常中经常用到的中间件&#xff0c;下面由我来给大家讲解一下改中间件常见的漏洞。 Apache是什么&#xff…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 &#xff09; 缓存工作原理分析 在了解了本地缓存和远程缓存之后&#xff0c;我们来探究缓存是如何工作的。以计算文件的哈希串为例&#xff0c;若后续运行任务时文件哈希串未变&#xff0c;系统会直接使用对应的输出和制品文件。 2 …...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...

STM32标准库-ADC数模转换器

文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”&#xff1a;输入模块&#xff08;GPIO、温度、V_REFINT&#xff09;1.4.2 信号 “调度站”&#xff1a;多路开关1.4.3 信号 “加工厂”&#xff1a;ADC 转换器&#xff08;规则组 注入…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...