当前位置: 首页 > 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…...

用多种指针方法访问数据元素,实现逆序输出

这里注意下数组指针的下标表示&#xff1a; 我们已经知道&#xff0c;数组名a总是指向a[0]的指针&#xff0c;*(ai)是对a[i]的引用&#xff0c;实际上&#xff0c;编译器中&#xff0c;对数组的引用&#xff0c;如a[i]&#xff0c;总是被编译器改写成*(ai)的形式。 另外说明下…...

WebDAV之葫芦儿·派盘+NMM

NMM 支持WebDAV方式连接葫芦儿派盘。 推荐一款文件管理器,可以对手机中的文件进行多方面的管理,支持语法高亮和ftp等远程的文件的管理。支持从WebDav服务器连接葫芦儿派盘服务下载文件和上传文件。 NMM文本编辑器是一款文件管理器,在功能上面更加的适合于一些编程人员进行使…...

Redis多级缓存

文章目录一. 什么是多级缓存二. JVM进程缓存一. 什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; 请求要经过Tomcat处理&#xff0c;Tomcat的性能…...

【原创】java+swing+mysql会议室管理系统设计与实现

本文主要介绍使用javaswingmysql等技术去设计完成一个企业公司的会议室管理系统&#xff0c;帮助企业员工去进行会议室的预约安排。 功能分析&#xff1a; 会议室管理系统的使用角色&#xff0c;一般分为管理员和员工用户&#xff0c;管理员进行数据管理&#xff0c;员工进行…...

【Redis】Redis 常用数据类型操作 ① ( 数据库操作 | Redis 数据库连接参数 | Redis 数据库个数 | Redis 访问机制 )

文章目录一、Redis 数据库连接参数二、Redis 数据库个数三、Redis 访问机制一、Redis 数据库连接参数 连接 Redis 数据库 , 只需要 IP 地址 , 端口号 , 访问密码 即可 , 如果没有 设置 访问密码 可忽略该选项 ; Redis 默认端口号是 6379 ; 参考 【Redis】Redis 数据库 安装、…...

GAMES101-计算机图形学入门 LEC4: TRANSFORMATION-3D

本节课程视频地址&#xff1a;https://www.bilibili.com/video/BV1X7411F744/?p4 补充上一节课的一个内容&#xff0c;旋转矩阵的逆矩阵是它的转置&#xff0c;也就是说有R−θRθ−1RθTR_{-\theta} R_\theta^{-1}R_\theta^TR−θ​Rθ−1​RθT​ 上节课讲了&#xff0c;…...

robot实战:截取字符串

一&#xff1a;变量标识符号(1) Scalar型变量: "$"作为标识符号&#xff0c;例如&#xff1a;${var}&#xff0c; 这个打印log时只能用logset赋值&#xff1a;a: ${var} Set Variable abcb:${var2} Set Variable If ${Var}abc efgh ace 如果var的值和abc相等&#xf…...

【面经】滴滴测开一面

滴滴测开一面 面试官自我介绍面试者自我介绍大概实习多久&#xff1f;你在在校经历比较丰富&#xff0c;说一下打ACM那些比赛中的一些经验&#xff0c;找一些具体的项目说一下在打ACM中团队里几个人&#xff1f; 你负责什么&#xff1f;在上段实习的过程中都做了哪些事情&…...

数据治理-主数据

二、某企业集团旗下有房地产、供应链、物流、酒店等多个业务子公司&#xff0c;为了统一管理&#xff0c;集团推进数字化转型&#xff0c;建立了统一的数据仓库&#xff0c;各子公司将数据集成到集团信息部负责管理的 数据平台。集团在实施数据治理过程中&#xff0c;发现各业务…...

软考-中级-软件设计师-成绩

低分飘过&#xff0c;备考经验主要就是刷题。...

高唐做网站推广/hao123网址之家官网

最近在复习JS&#xff0c;写着练练手 项目结构 整个项目分成六个部分 Util 工具类Param 配置类Pipe 管道类Bird 鸟类Score 分数类Main 主程序 显示效果 游戏效果大概是这样&#xff0c;碰撞坐标的判定感觉还有点问题&#xff0c;有空再调&#xff1a; 模块介绍 下面简单介…...

wordpress多个主页/便宜的seo网络营销推广

JS HTML DOM方法HTML DOM方法是可以对HTML元素执行的操作。HTML DOM属性是可以设置或更改的HTML元素的值。DOM编程接口可以使用JavaScript(和其他编程语言)访问HTML DOM。在DOM中&#xff0c;所有HTML元素都定义为objects。编程接口是每个对象的属性和方法。一个属性是一个值&a…...

vps如何wordpress/中国站长之家

Eclipse可以自动识别程序中存在的语法错误&#xff0c;当项目中某个文件中存在错误时&#xff0c;会在界面左侧的“Package Explorer”的项目包浏览中显示有错误存在&#xff0c;并且在相应文件的错误代码处也有错误提示&#xff0c;如图1所示。 图1 Eclipse中的错误提示 但是…...

网站开发需求分析word/免费网站友情链接

之前已经写过一篇关于Lucene安装学习的文章&#xff1a;http://www.cnblogs.com/charlesblc/p/5980525.html 还有一篇关于Solr安装使用的文章&#xff1a;http://www.cnblogs.com/charlesblc/p/5981292.html 上面两篇比较偏实践和应用&#xff0c;开了个头&#xff1b;这一篇是…...

asp做旅游网站毕业论文/备案域名出售平台

终于放寒假了&#xff0c;哈哈哈&#xff0c;然后&#xff0c;也不准备闲着吧&#xff0c;就是再熟悉一下旧的东西&#xff0c;然后把新的东西也拿来分享一下&#xff0c;自己也准备好了再这个寒假 好好的提高一下自己&#xff0c;哎&#xff0c;菜鸟一枚&#xff0c;真正去实…...

深圳广东网站建设套餐/郑州网站优化排名

01 listPython内置的一种数据类型是列表&#xff1a;list。list是一种有序的集合&#xff0c;可以随时添加和删除其中的元素。比如&#xff0c;列出班里所有同学的名字&#xff0c;就可以用一个list表示&#xff1a;classmates [Michael, Bob, Tracy]print(classmates)变量cla…...