使用 MySQL 创建直方图 – 教程
要使用 MySQL 创建统计查询来构建直方图,您可以使用 COUNT() 函数和 GROUP BY 来计算分组约束创建的指定范围或类别内的值的出现次数。
特别是对于时间序列数据,直方图有很多用例,例如监控过去 30 天内每天注册的用户数量。我们在管理后端使用这些查询来监控一些重要的 KPI。
不幸的是,SQL 数据库从来没有对表示直方图的本机支持,但它们是用于跟踪各种指标的最常用图表之一。
在本文中,我将向您展示如何为此目的创建查询并克服一些限制。假设您有一个名为 sales 的表,其中包含名为 sale_date 的列,其中包含每次销售的日期和时间。您想要创建一个直方图,显示每月间隔内的销售额分布。
SELECT DATE_FORMAT(sale_date, '%Y-%m') AS sales_month, COUNT(*) AS count FROM sales GROUP BY DATE_FORMAT(sale_date, '%Y-%m');
此查询:
- DATE_FORMAT(sale_date, '%Y-%m') 将 sale_date 列格式化为年月格式(例如,“2024-01”表示 2024 年 1 月)。
- COUNT(*) 统计每个月内发生的销售次数。
- FROM sales 指定从中检索数据的表。
- GROUP BY DATE_FORMAT(sale_date, '%Y-%m') 根据格式化的销售日期将销售数据按月分组。
此查询将为您提供每个月间隔内的销售发生次数,允许您创建直方图以可视化销售随时间的分布情况。
如何填补直方图查询中的空白
运行此查询,您可能会在结果集中看到一些缺失的月份,可能是因为在某些月份没有销售,因此 GROUP BY 函数无法生成这些间隔的数据。
如何调整查询以使用默认零值填补这些空白?否则直方图仍然不完整。
为了填补结果集中的空白并确保代表所有月份,即使某些月份没有销售,您也可以使用递归公用表表达式 (CTE) 动态生成所选日历间隔的月份。
它生成涵盖所需时间范围的日期序列。然后,您可以将此日期序列与您的销售数据左连接,以将所有月份包含在结果集中。
WITH RECURSIVE DateRange AS ( SELECT DATE_FORMAT(DATE_SUB(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 11 MONTH), '%Y-%m-01') AS min_date, DATE_FORMAT(NOW(), '%Y-%m-01') AS max_date UNION ALL SELECT DATE_FORMAT(DATE_ADD(min_date, INTERVAL 1 MONTH), '%Y-%m-01'), max_date FROM DateRange WHERE DATE_ADD(min_date, INTERVAL 1 MONTH) <= max_date ) SELECT DATE_FORMAT(DateRange.min_date, '%Y-%m') AS sales_month, COUNT(sales.sale_date) AS count FROM DateRange LEFT JOIN sales ON DATE_FORMAT(DateRange.min_date, '%Y-%m') = DATE_FORMAT(sales.sale_date, '%Y-%m') GROUP BY sales_month ORDER BY sales_month;
DateRange CTE(通用表表达式)递归地生成一系列月份,涵盖销售表中最小和最大销售日期之间的时间范围。
此查询根据销售表中的最小和最大销售日期动态生成所选日历间隔的月份,确保所有月份都显示在结果集中。
用代码填补空白
SQL 解决方案对于开发人员来说可能不太舒服,而且需要更多的自定义可能会导致更喜欢基于代码的解决方案。
在这种情况下,您可以通过三个简单的步骤获得相同的结果:
- 根据您感兴趣的时间间隔创建数组;
- 获取GROUP BY查询的结果;
- 合并它们。
这是使用 Laravel 和 Carbon 库的代码片段:
$dates = []; // Create the array with the time interval of your interests for( $day = now()->subDays(31); $day->startOfDay()->lte(now()); $day->addDay() ) { $dates[] = [ 'day' => $day->format('Y-m-d'), 'total' => 0, ]; } // Get the result from the GROUP BY query $sales = $product->sales()->select(DB::raw('DATE(sale_at) as day, CAST(SUM(qty) AS UNSIGNED) as total')) ->where('sale_at', '>=', now()->subDays(31)) ->groupBy('day') ->get(); // Merge them return array_map(function ($date) use ($sales) { foreach ($sales as $sale) { if ($date['day'] === $sale['day']) { return $sale; } } }, $dates);
如果您有兴趣阅读更多有关数据库的文章,您可以查看以下文章:
- 如何扩展 SQL 数据库
- 如何复制 MySQL 表
- 已解决 - 违反完整性约束
- 使用 Laravel 预加载每天节省 120 万次查询
- 如何通过智能 SQL 查询加速应用程序性能
- 使您的应用程序可扩展,优化 ORM 性能
- 已解决 – 使用 Laravel 队列和作业超出 MySQL 锁等待超时
免费监控您的 PHP 应用程序
Inspector是一款专为软件开发人员设计的代码执行监控工具。您无需在云基础设施上安装任何内容,只需安装 Laravel 软件包即可开始使用。
Inspector 超级易于使用,并且需要零配置。
如果您正在寻找 HTTP 监控、查询见解以及将警报和通知转发到您首选消息传递环境的功能,请免费尝试 Inspector。 [注册您的帐户+(https://app.inspector.dev/register)。
或在网站上了解更多信息:https://inspector.dev
以上是使用 MySQL 创建直方图 – 教程的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undress AI Tool
免费脱衣服图片

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

TosecurelyConnectToaremoteMysqlServer,Usesshtunneling,configuremysqlforremoteaccess,setFireWallrules,andConsidersSlencryption 。首先,stardansshtunnelwithssh-l3307:localhost:3306user@remote-Server-server-nandConnectViamySql-h127.0.0.0.0.1-p3307.second,editmys

要将MySQL的bin目录添加到系统PATH,需根据不同操作系统进行配置。1.Windows系统:找到MySQL安装目录下的bin文件夹(默认路径通常为C:\ProgramFiles\MySQL\MySQLServerX.X\bin),右键“此电脑”→“属性”→“高级系统设置”→“环境变量”,在“系统变量”中选中Path并编辑,新增MySQLbin路径,保存后重启命令提示符并输入mysql--version验证;2.macOS和Linux系统:Bash用户编辑~/.bashrc或~/.bash_

mysqldump是用于执行MySQL数据库逻辑备份的常用工具,它生成包含CREATE和INSERT语句的SQL文件以重建数据库。1.它不备份原始文件,而是将数据库结构和内容转换为可移植的SQL命令;2.适用于小型数据库或选择性恢复,不适合TB级数据快速恢复;3.常用选项包括--single-transaction、--databases、--all-databases、--routines等;4.恢复时使用mysql命令导入,并可关闭外键检查以提升速度;5.建议定期测试备份、使用压缩、自动化调

开启MySQL慢查询日志并分析可定位性能问题。 1.编辑配置文件或动态设置slow_query_log和long_query_time;2.日志包含Query_time、Lock_time、Rows_examined等关键字段,辅助判断效率瓶颈;3.使用mysqldumpslow或pt-query-digest工具高效分析日志;4.优化建议包括添加索引、避免SELECT*、拆分复杂查询等。例如为user_id加索引能显着减少扫描行数,提升查询效率。

处理MySQL中的NULL值需注意:1.设计表时关键字段设为NOTNULL,可选字段允许NULL;2.查询判断必须用ISNULL或ISNOTNULL,不能用=或!=;3.可用IFNULL或COALESCE函数替换显示默认值;4.插入或更新时直接使用NULL值需谨慎,注意数据源和ORM框架处理方式。NULL表示未知值,不等于任何值,包括自身,因此查询、统计、连接表时要特别小心,避免漏数据或逻辑错误。合理使用函数和约束可以有效减少因NULL带来的干扰。

ForeignkeysinMySQLensuredataintegritybyenforcingrelationshipsbetweentables.Theypreventorphanedrecords,restrictinvaliddataentry,andcancascadechangesautomatically.BothtablesmustusetheInnoDBstorageengine,andforeignkeycolumnsmustmatchthedatatypeoftherefe

要检查MySQL版本,可在Windows命令提示符中使用以下方法:1.使用命令行直接查看,输入mysql--version或mysql-V;2.登录MySQL客户端后执行SELECTVERSION();;3.通过安装路径手动查找,切换到MySQL的bin目录后运行mysql.exe--version。这些方法分别适用于不同场景,前两种最常用,第三种适合未配置环境变量的情况。

要重置MySQL的root密码,请按以下步骤操作:1.停止MySQL服务器,使用sudosystemctlstopmysql或sudosystemctlstopmysqld;2.以--skip-grant-tables模式启动MySQL,执行sudomysqld--skip-grant-tables&;3.登录MySQL并根据版本执行相应的SQL命令修改密码,如FLUSHPRIVILEGES;ALTERUSER'root'@'localhost'IDENTIFIEDBY'your_new
