mysql复杂sql书写示例

参考:
mysql复杂sql书写示例

查询当天在某个小时之前每个小时的数据量

sql 复制代码
select DATE_FORMAT(create_time,'%H') hours,count(1) count from movie_item where date(create_time)=date(now()) group by hours
复制代码
06	129
07	12
08	23
09	236

查询过去30天每天的数据量

sql 复制代码
select * from (select date(create_time) as day, count(1) as day_count from movie_item  where  DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(create_time) group by day desc
) k order by day 
复制代码
2024-07-16	872
2024-07-17	820
2024-07-18	766
2024-07-19	1030
2024-07-20	935
2024-07-21	1670
2024-07-22	1402
2024-07-23	1885
2024-07-24	1668
2024-07-25	1377

获取最近30天每天的总量和每天到当前小时+1为止的数据量

sql 复制代码
select date(create_time) as day, count(1) as day_count, '总量' as status from movie_item  where  DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(create_time) group by day 

union 
select date(create_time) as day, count(1) as current_count, '迄今' as status from movie_item where    DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(create_time) AND DATE_FORMAT(create_time, '%H') <  DATE_FORMAT(now(),'%H') + 1 group by day

结果:

sql 复制代码
2024-07-16	872	总量
2024-07-17	820	总量
2024-07-18	766	总量
2024-07-19	1030	总量
2024-07-20	935	总量
2024-07-21	1670	总量
2024-07-22	1402	总量
2024-07-23	1885	总量
2024-07-24	1668	总量
2024-07-25	1377	总量
...
2024-08-08	1178	迄今
2024-08-09	891	迄今
2024-08-10	1524	迄今
2024-08-11	880	迄今
2024-08-12	593	迄今
2024-08-13	846	迄今
2024-08-14	1197	迄今
2024-08-15	1385	迄今

这种方式方便构建可视化的图,另一种更常见的查询方式是:

sql 复制代码
select current.day as day, current_count, day_count from(select date(create_time) as day, count(1) as current_count from movie_item where    DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(create_time) AND DATE_FORMAT(create_time, '%H') <  DATE_FORMAT(now(),'%H') + 1 group by day) current left join (select * from (select date(create_time) as day, count(1) as day_count from movie_item  where  DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(create_time) group by day desc
) k order by day ) daily on current.day=daily.day;
复制代码
day, current_count, day_count
2024-07-16	667	872
2024-07-17	458	820
2024-07-18	465	766
2024-07-19	660	1030
2024-07-20	539	935
2024-07-21	1015	1670
2024-07-22	1177	1402
2024-07-23	714	1885
2024-07-24	960	1668
2024-07-25	692	1377
...

这种方式更适合显示成表格。

使用IFNULL保障传参不合适的情况下仍然有默认结果输出

sql 复制代码
select DATE_FORMAT(create_time,'%H') hours,count(1) count from movie_item where date(create_time)=IFNULL(date(${days}), date(now())) group by hours

由于在导入参数${days}时,会自动使用双引号包起来,所以即使传参为now(),也会变成"now()",date("now()")=null,所以会调用后面的默认方法获取数据。

按预设顺序排序

sql 复制代码
select * from xxx where id in (  618 , 619 , 1329 , 1336 , 1323 , 1324 , 1330 , 1331 , 1325 , 1326 ) order by FIELD(id , 618 , 619 , 1329 , 1336 , 1323 , 1324 , 1330 , 1331 , 1325 , 1326 );
复制代码
618	    36092115
619     36810193
1329	6436754
1336	3037173
1323	1478186
1324	2301032
1330	25964242
1331	35043784
1325	2245704
1326	36289423

查询时使用case when映射状态到文本

sql 复制代码
select * from (select date(create_time) as day, (case s.spider_status when -1 then '失败' when 0 then '成功' end) as status, count(1) as count from spider_status s where  DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(create_time)  group by day desc, status desc ) k order by day
复制代码
2024-07-21	成功	366
2024-07-21	失败	37
2024-07-22	成功	457
2024-07-22	失败	84
2024-07-23	成功	843
2024-07-23	失败	107
2024-07-24	成功	577
相关推荐
问道飞鱼12 分钟前
【数据库知识】MySQL 多表关联高效实现指南:场景化方案与底层原理
数据库·mysql·多表关联
马克学长13 分钟前
SSM校园二手交易平台7fut7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·校园闲置资源交易
dblens 数据库管理和开发工具20 分钟前
MySQL :5.7与8.0版创建用户与授权、密码认证插件、角色、密码过期策略
数据库·mysql·dblens·mysql创建用户·mysql设置密码·mysql用户授权
曹牧32 分钟前
Oracle:字段为值列表
数据库·oracle
亮子AI39 分钟前
【Prisma】如何修复(重建)已经损坏的迁移历史?
数据库·prisma
卡尔特斯1 小时前
Mysql ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded
mysql
+VX:Fegn08951 小时前
计算机毕业设计|基于springboot + vue职位管理推荐系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
热爱专研AI的学妹1 小时前
【搭建工作流教程】使用数眼智能 API 搭建 AI 智能体工作流教程(含可视化流程图)
大数据·数据库·人工智能·python·ai·语言模型·流程图
小韩博1 小时前
小迪第42课:PHP应用&MYSQL架构&SQL注入&跨库查询&文件读写&权限操作
sql·mysql·网络安全·架构·php
DBA小马哥1 小时前
国产数据库加速替代Oracle:聚焦信创背景下的平滑迁移与性能突破
数据库·oracle