mysql 查询中的几类问题

MySQL查询常见错误及其解决方法 在使用MySQL的过程中,相比大家都踩过不少坑,下面我将列举日常生活中比较高频的三个”坑“,也欢迎大家踊跃分享自己的心路历程 🙃!最后小结一下,本文主要介绍了MySQL查询中三个比较容易踩的坑,从中我们可以得到:1、SELECT返回的顺序跟多种因素有关,如插入顺序、主键ID顺序、索引顺序等,如果你返回的结果要求有顺序,则记得加上order by。2、加上了order by也不要高兴地太早,还需要检查order by的字段是否唯一,如果不唯一,返回的结果也有可能是随机的。 阅读详情

一、留存率问题

        次日留存率:第二天有访问行为的留存用户/注册当天的新客总数。

        第3日留存率:第3天内内访问的留存用户/注册当天的新客户总数。

        第7日留存率:第7天内访问的留存用户/注册当天的新客户总数。

        第30日留存率:第30内访问的留存用户/注册当天的新客户总数。

案例:

create table `tb_user_login`
(
`user_id` varchar(300) comment '用户ID',
`login_date` date comment '登录日期'
) engine=innodb;
 
insert into `tb_user_login` (`user_id` , `login_date`)
values
    ('A', '2019/9/2'),
    ('A', '2019/9/3'),
    ('A', '2019/9/4'),
    ('B', '2019/9/2'),
    ('B', '2019/9/4'),
    ('B', '2019/9/10'),
    ('C', '2019/1/1'),
    ('C', '2019/1/2'),
    ('C', '2019/1/30'),
    ('C', '2019/9/3'),
    ('C', '2019/9/4'),
    ('C', '2019/9/5'),
    ('C', '2019/9/11'),
    ('C', '2019/9/12'),
    ('C', '2019/9/13');

问题一:查询连续3天登录的用户ID

思路:1.根据登陆时间字段创建排序辅助列,row_number() over()窗口函数

          2.将登录时间与添加的辅助列差值运算(subdate()函数等同于date_sub()函数功能),得到新的日期,并根据该日期分组

          3.对结果进行筛选

select distinct user_id
from (
    select user_id, login_date,row_number() over(partition by user_id order by login_date) as rn from tb_user_login
) as temp 
group by user_id, subdate(login_date, rn)
having count(1) >= 3;

问题二:查询每天新增用户数以及他们次日留存率和三十日留存率

方法一:

        1.根据登陆时间字段创建时间辅助列 min(login_date) over() 得到最早登录时间

        2.使用聚合函数sum()、时间运算函数datediff()计算登录时间与最早登录时间的差值,差值为1为次日;差值为30为三十日;

        3.新增用户数对用户id去重

        4.根据计算公式求值

select 
count(distinct user_id) 新增用户数,
sum(datediff(login_date,reg_time)=1) 次日留存数,
sum(datediff(login_date,reg_time)=30) 三十日留存数,
sum(datediff(login_date,reg_time)=1)/count(distinct user_id) 次日留存率,
sum(datediff(login_date,reg_time)=30)/count(distinct user_id) 三十日留存率
from (select user_id,login_date,min(login_date) over(partition by user_id order by login_date) reg_time from tb_user_login)t1
group by reg_time;

方法二:

        1.根据登陆时间字段创建时间辅助列 min(login_date) over() 得到最早登录时间,作为子查询表

        2.将原表与子表做联合查询,追加联合查询的条件,其他与方法一类似

SELECT 
first_login,
COUNT(DISTINCT t1.user_id) as 新增用户数,
COUNT(DISTINCT t2.user_id) /COUNT(DISTINCT t1.user_id) as 次日留存,
COUNT(DISTINCT t3.user_id) /COUNT(DISTINCT t1.user_id) as 三十日留存 
from (
SELECT user_id,login_date,MIN(login_date) over (PARTITION by user_id ORDER BY login_date ) as first_login from tb_user_login
)t1 
LEFT JOIN tb_user_login as t2 
on t1.user_id = t2.user_id and DATEDIFF(t2.login_date,first_login)=1
left JOIN tb_user_login as t3
on t1.user_id = t3.user_id and DATEDIFF(t3.login_date,first_login)=29
GROUP BY first_login;

二、某商品活动用户下单量问题

       公式: 每天平均订单量:某段时间内的订单量/天数

案例:

create table `tb_order`
(
`order_id` bigint unsigned comment '订单ID',
`user_id` varchar(300) comment '用户ID',
`order_pay` int comment '订单金额',
`order_time` datetime comment '下单时间'
) engine=innodb;

insert into `tb_order` values 
    (1, 'A', 100, '2021-11-10'),
    (1, 'A', 200, '2021-11-10'),
    (2, 'B', 300, '2021-11-10'),
    (3, 'C', 400, '2021-11-11'),
    (3, 'C', 500, '2021-11-11'),
    (3, 'C', 600, '2021-11-11'),
    (4, 'A', 700, '2021-11-12'),
    (4, 'A', 800, '2021-11-12'),
    (5, 'B', 700, '2021-11-12'),
    (6, 'B', 600, '2021-11-12'),
    (7, 'A', 500, '2021-11-13'),
    (7, 'A', 400, '2021-11-13'),
    (8, 'D', 300, '2021-11-12'),
    (9, 'E', 200, '2021-11-12');

create table `tb_act_apply`
(
`act_id` int unsigned comment '活动编号',
`user_id` varchar(300) comment '用户ID',
`act_time` datetime comment '报名时间'
) engine=innodb;

insert into `tb_act_apply` values 
    (1, 'A', '2021-11-11'),
    (2, 'B', '2021-11-09'),
    (3, 'C', '2021-11-11'),
    (1, 'D', '2021-11-12');

问题一:查询每个活动对应所有用户在报名后产生的总订单金额,总订单数
              说明:每个用户只能参与一个活动,用户报名后产生的订单就是参加活动的订单。

        思路:订单表与用户报名表联合查询,此处使用 join()……using() 效果等同于 join()……on

SELECT act_id as 活动编号,SUM(order_pay) as 订单金额,COUNT(DISTINCT order_id) as 总订单数 
from tb_order t1 JOIN tb_act_apply t2 using(user_id) 
where t1.order_time>=t2.act_time 
GROUP BY act_id;

问题二:查询每个活动从开始后到“2021年11月13日”前平均每天产生的订单数(活动开始时间定义为最早有用户报名的时间)

        思路:1.使用聚合函数 min()…… over()添加辅助列,得到不同活动的开始时间列,将该表作为一个查询子表

                   2.筛选订单时间大于活动时间的用户

                   3.根据商品和活动时间分组

-- 使用聚合函数创建辅助列,得到不同活动的开始时间
SELECT act_id,user_id,act_time,min(act_time) over (PARTITION BY act_id) as begin_time from tb_act_apply;

-- 关键点:对用户ID去重统计用户数量/满足要求的天数
SELECT 
act_id,
COUNT(DISTINCT order_id) / DATEDIFF('2021-11-13',begin_time) as 平均订单数量
from (SELECT act_id,user_id,act_time,min(act_time) over (PARTITION BY act_id) as begin_time from tb_act_apply) t1 JOIN tb_order t2 using(user_id)
WHERE order_time >= act_time and order_time<'2021-11-13' 
GROUP BY act_id,begin_time;

三、流程操作问题

        每天用户的平均操作次数:当天的操作次数 / 用户数;注意对用户id去重

案例:

create table `tb_tracking_log`
(
`user_id` varchar(300) comment '用户ID',
`oper_id` int unsigned comment '操作ID',
`log_time` datetime comment '操作时间'
) engine=innodb;

insert into `tb_tracking_log` values 
    ('A', 1, '2021-11-11 09:20:00'),
    ('A', 2, '2021-11-11 09:21:00'),
    ('A', 5, '2021-11-11 09:22:00'),
    ('B', 5, '2021-11-11 09:20:00'),
    ('B', 1, '2021-11-11 09:21:00'),
    ('C', 4, '2021-11-12 09:20:00'),
    ('D', 1, '2021-11-12 09:20:00'),
    ('D', 3, '2021-11-12 09:21:00'),
    ('D', 2, '2021-11-12 09:22:00'),
    ('E', 1, '2021-11-11 09:20:00'),
    ('E', 2, '2021-11-12 09:21:00');

问题一:查询每天的访客数和他们的平均操作次数(简单)

select 
    date(log_time) as date,
    count(distinct user_id) as 访客数,
    count(1) / count(distinct user_id) as 平均操作次数
from tb_tracking_log group by date;

问题二: 查询每天符合以下条件的用户ID。
               要求:操作1之后是操作2,操作1和2必须相邻

        思路:1.使用向下偏移窗口函数,添加辅助列 lead( )…… over(partion by …order by …)作为查询子表

                  2.将原表与子表联合查询,若原表oper_id=1,子表辅助列next_op_id=2,则满足要求

-- 使用向下偏移窗口函数,添加辅助列lead(exp_str,offset,defval) over(partion by …order by …)
SELECT *,LEAD(`oper_id`,1,0) over (PARTITION by DATE(log_time),user_id ORDER BY log_time) as next_op_id from tb_tracking_log;
-- 与原表联合查询
SELECT user_id 
from (SELECT *,LEAD(`oper_id`,1,0) over (PARTITION by DATE(log_time),user_id ORDER BY log_time)as next_op_id from tb_tracking_log) t1 
where oper_id=1 and next_op_id=2;

python基础:工作会用到的95%的基础python代码都在这了(万字详解!) 本文是一份Python编程语言的快速参考备忘单,涵盖了Python基础语法和常用数据类型。主要内容包括:Python入门指南(打印、变量声明)、内置数据类型(字符串、数值、列表、元组、集合、字典等)、控制结构(判断、循环)、函数定义、文件处理操作以及字符串操作方法(切片、循环遍历等)。这个备忘单特别适合初学者快速查阅Python基础语法,同时也提供了数据类型转换、f-string格式化字符串等实用技巧。通过简洁的代码示例展示了Python的基本语法规则和典型用法。 阅读详情

相关推荐

风力发电机缺陷检测平台

风力发电机缺陷检测平台相关内容展示

weixin_39779415的博客 1111

MySQL查询常见问题

MySQL查询常见问题

ronshi的博客 371

01-认识脑电信号及相关信号的预处理过程

脑电信号处理过程脑电实验为什么要预处理预处理方法降采样如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 脑电实验 本博客主要是记录基于脑电信号的情绪识别方法的研究...

脑机交流者的博客 7660

MySQL 查询避坑指南

在MySQL查询中,你可能会不经意的掉入某些坑中,甚至某些坑可能让你不死也掉半条命。

zjcxc(邹建)的Blog - SQL Server 1286

LVGL 离线字体转换lv_font_conv本地安装

LVGL FONT CONV 离线版本

liu132641的专栏 3386

主题035:计算流体力学(CFD)

计算流体力学(Computational Fluid Dynamics, CFD)是利用数值方法求解流体流动、传热传质等问题的学科。CFD已成为化学反应工程中反应器设计和优化的重要工具。∂ρ∂t+∇⋅(ρu)=0 \frac{\partial \rho}{\partial t} + \nabla \cdot (\rho \mathbf{u}) = 0 ∂t∂ρ​+∇⋅(ρu)=0对于不可压缩流动:∇⋅u=0 \nabla \cdot \mathbf{u} = 0 ∇⋅u=0动量方程:∂(ρu)∂t+∇⋅(ρ

kkchenjj的博客 267

MySQL数据相关问题总结(精选)

什么是索引? 索引其实是一种数据结构,能够帮助我们快速的检索数据库中的数据。是帮助MySQL高效获取数据的,排好序的数据结构。

后青春的诗 2360

AutoSAR配置视频讲解:简介

AutoSAR实验视频讲解:闪烁一颗LED实验【简介】 大家好,欢迎来到雪云飞星的《AutoSAR实验课的视频讲解》专栏。看过《AutoSAR入门到精通系列讲解》的朋友们应该对博主不陌生,有很多朋友加了博主的微信成为了好友,还有朋友约过线下见面,博主很高兴大家能从我的博客中获得一些收获。在专栏里博主挖了很多坑,当时也说过想要录制一个AutoSAR的配置视频教程,素材在20年初就已经录好,中间各种原因足足鸽了一年。当时因为一些技术原因只能通过博客的图文形式展示出来,现在我们剪辑了视频,请了专业的配音,希望以视

雪云飞星的博客 9653

MySQL常见问题汇总及解答

MySQL常见问题汇总及解答 1、分组显示,想把一个字段相同数据放在一起查询出来 解决方案:使用排序 order by(column_name) 例如:把分数相同的学生放在一起然后查询出来 select * from student order by score desc; 如果这个字段没有用到索引,在数据库中查询会很慢,所以这个操作一般都是在java代码中完成的 2、删除表中相同字段 例如:删除emp_no重复的记录,只保留最小的id对应的记录。 CREATE TABLE IF NOT EXISTS t

qq_38056518的博客 735

游戏大厂技术护城河:你以为他们靠“美术和买量”,其实背后全是硬家伙

先把效果堆满到快上线了才发现低端机跑不动然后疯狂砍特效、降分辨率,画面崩、口碑崩机型分档(低/中/高)每帧预算(CPU/GPU 各多少 ms)每种资源预算(贴图、网格、粒子数量)性能自动回归(每天跑性能测试,发现波动立刻报警)大白话:小厂像装修到入住前才发现电路不够,临时拉线;大厂从设计图开始就算承重、算电路、算水压。玩家会不会来?活动会不会爆?版本会不会翻车?外挂会不会泛滥?竞品会不会抄?流量不确定 → 可扩容架构版本不确定 → 灰度与回滚。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 104

VTK实战完整教程介绍

该专栏以VTK提供的Example为基础,讲解VTK中的相关接口和使用方法。订阅该专栏,带你了解所有VTK的功能,以便VTK更好的解决工作中遇到的问题。一起学习起来吧!

qq_40041064的博客 2505

MySQL中的复杂查询之子查询语句解析

在MySQL数据库查询中,子查询(Subquery)是一种强大的查询方式,它允许在一个SQL语句中嵌套另一个SQL查询,从而实现更复杂的数据查询和筛选。子查询常用于查询特定条件的数据、进行计算或与主查询结合以获取更精确的结果。本文将详细解析MySQL中的子查询语句,包括其分类、使用方法、优化建议以及实际应用示例,帮助您深入掌握子查询的用法。

939

【人工智能】提示词工程:让大模型精准响应的核心技术,提示词的基础框架 以及 常见提示词框架及场景

编写提示词的基础原则包括:简单、明确、详细,提示词拥有零样本提示、少样本提示、分配角色、提示写作风格、限定输出格式等技巧。

奶爸的编程之路,也就一周冷个三天 1138

MySQL中的几类日志文件介绍

MySQL中的几类日志文件介绍 关于Mysql日志 splunk内置了两种mysql的日志,分别是mysqld以及mysql_error my...

小麦苗DBA宝典 499

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

mysql默认日志路径_MySQL中的这几类日志,你一定要知道

前言:在 MySQL 系统中,有着诸多不同类型的日志。各种日志都有着自己的用途,通过分析日志,我们可以优化数据库性能,排除故障,甚至能够还原数据。这些不同类型的日志有助于我们更清晰的了解数据库,在日常学习及运维过程中也会和这些日志打交道。本节内容将带你了解 MySQL 数据库中几种常用日志的作用及管理方法。 1.错误日志(errorlog)错误日志记录着 mysqld 启动和停止,以及...

weixin_35896668的博客 3244

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

mysql long类型_MySQL中的这几类日志,你一定要知道

前言:在 MySQL 系统中,有着诸多不同类型的日志。各种日志都有着自己的用途,通过分析日志,我们可以优化数据库性能,排除故障,甚至能够还原数据。这些不同类型的日志有助于我们更清晰的了解数据库,在日常学习及运维过程中也会和这些日志打交道。本节内容将带你了解 MySQL 数据库中几种常用日志的作用及管理方法。 1.错误日志(errorlog)错误日志记录着 mysqld 启动和停止,以及...

weixin_39727005的博客 100

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MySQL之select查询

结构化查询语言(Structured Query Language),在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。使用SQL语句,程序员和数据库管理员可以完成如下的任务。改变数据库的结构更改系统的安全设置增加用户对数据库或表的许可权限(root和普通用户的权限)在数据库中检索需要的信息对数据库的信息进行更新别名。

huaz_md的博客 3301

mysql的查询日志分为哪几类_Mysql数据库日志类型查询与配置详解

在mysql中日志分为很多种,下面小编来给大家介绍Mysql数据库日志类型查询与使用,希望对各位同学会有所帮助mysql常见的日志类型有五种:错误日志、二进制日志、查询日志、慢查日志和中继日志。一、错误日志错误日志包含四类信息:(1) 服务器启动和关闭进程过程中的信息;(2) 服务器运行过程中的错误信息;(3) 事件调度器运行一个事件时产生的信息;(4) 在从服务器上启动从服务器进程时产生的信息。...

weixin_42395171的博客 1513

MySQL 嵌套子查询 with子句 from子查询 in子查询 join子查询

with子句、from子查询、join子查询、in子查询,在复杂查询问题中经常会用到这几种方法,以3个由简到难的案例说明这些方法的用法。

我的博客 1万+

SQL中的多表关联查询

一篇文章带你了解数据库SQL中的多表关联查询

m0_69371690的博客 2764

mysql 5.5有以下几种日志,MySQL中的这几类日志,你一定要知道

前言:在 MySQL 系统中,有着诸多不同类型的日志。各种日志都有着自己的用途,通过分析日志,我们可以优化数据库性能,排除故障,甚至能够还原数据。这些不同类型的日志有助于我们更清晰的了解数据库,在日常学习及运维过程中也会和这些日志打交道。本节内容将带你了解 MySQL 数据库中几种常用日志的作用及管理方法。1.错误日志(errorlog)错误日志记录着 mysqld 启动和停止,以及服务器在运行过...

weixin_29374181的博客 330

MySQL 子查询

文章目录一,子查询定义二、子查询分类三、字查询例举1. ANY进行子查询2. 使用IN进行子查询3. 使用SOME进行子查询4. 使用ALL进行子查询5. 标量子查询6. 多值子查询7. 独立子查询sql语句1:获得所有hangzhou顾客的订单号。sql语句2:获得城市为hangzhou,并且存在订单的用户。8. 相关子查询9. EXISTS谓词10. 派生表四、子查询优化使用连接(JOIN)来代替子查询例子1:优化前:优化后:例子2:优化前:优化后:注:不能优化的子查询 一,子查询定义 1.定义

梁辰兴的博客 1万+

mysql中子查询是什么_mysql子查询是什么

MySql的子查询是多表查询的一个重要组成部分,常常和连接查询一起使用,是多表查询的基础。下面本篇文章就来带大家了解一下子查询,希望对你们有所帮助。什么是子查询?子查询,又叫内部查询。当一个查询是另一个查询的条件时,称之为子查询。子查询可以使用几个简单命令构造功能强大的复合命令。子查询最常用于SELECT-SQL命令的WHERE子句中。子查询是一个 SELECT 语句,它嵌套在一个 SELECT、...

weixin_31507527的博客 2289

mysql 子查询类型_【MySQL】子查询之一

MySQL 从版本4 开始支持 SQL 标准要求的所有子查询格式和操作,同时扩展了特有的几种特性。本文会介绍子查询的类型以及相关的注意点。一 什么是子查询子查询是将一个 SELECT 语句的查询结果作为中间结果,供另一个 SQL 语句调用。如:SELECT * FROM t1 WHERE vid in (SELECT vid FROM t2);二 MySQL 子查询分类根据子查询的返回数据形...

weixin_28803437的博客 643

MySQL第四章,SQL高级二子查询

子查询(Subquery)是嵌套在其他SQL语句中的查询,也称为内查询(Inner Query)或嵌套查询(Nested Query)。子查询可以放在SELECT、INSERT、UPDATE、DELETE等语句中,并且支持多层嵌套,即子查询中还可以包含其他子查询。

it_s_raining的博客 2253

mysql 保存子查询_MySQL里面的子查询

一、子查询定义定义:子查询允许把一个查询嵌套在另一个查询当中。子查询,又叫内部查询,相对于内部查询,包含内部查询的就称为外部查询。子查询可以包含普通select可以包括的任何子句,比如:distinct、 group by、order by、limit、join和union等;但是对应的外部查询必须是以下语句之一:select、insert、update、delete、set或 者do。子查询的位...

weixin_39962889的博客 375
上一篇: MySQL窗口函数的使用总结
下一篇: mysql面试必会题型
continue_v
博客等级 码龄5年 17粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值