我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用MySQL查询一年中每月的记录数

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用MySQL查询一年中每月的记录数

以下演示将在下表数据中进行:

其中:id为主键用于表的连接;value1为需要统计的主体,如用户等;date为记录日期。

先说结论

SELECT
    tmp.value1 AS `value1`,
    MONTH(SUBSTRING_INDEX(tmp.ct, ',', 1)) AS `month`,
    LENGTH(tmp.ct) - LENGTH(
REPLACE
    (tmp.ct, ',', '')
) + 1 AS `cnt`
FROM
    (
    SELECT
        id,
        value1,
        GROUP_CONCAT(date_value) AS ct
    FROM
        test_year_record
    GROUP BY
        value1,
        INTERVAL(
            date_value,
            DATE(CONCAT('2022', '-01-01')),
            DATE(CONCAT('2022', '-02-01')),
            DATE(CONCAT('2022', '-03-01')),
            DATE(CONCAT('2022', '-04-01')),
            DATE(CONCAT('2022', '-05-01')),
            DATE(CONCAT('2022', '-06-01')),
            DATE(CONCAT('2022', '-07-01')),
            DATE(CONCAT('2022', '-08-01')),
            DATE(CONCAT('2022', '-09-01')),
            DATE(CONCAT('2022', '-10-01')),
            DATE(CONCAT('2022', '-11-01')),
            DATE(CONCAT('2022', '-12-01')),
            DATE(CONCAT('2023', '-01-01'))
        )
) AS tmp
JOIN test_year_record AS ot
ON
    ot.id = tmp.id
WHERE
    ot.value1 = 1 AND YEAR(SUBSTRING_INDEX(tmp.ct, ',', 1)) = '2022'

注:以’2022’为例,上面结论中使用了CONCAT方法进行字符串拼接,方便了年份替换,可以直接替换置对应的ORM的参数等。

查询结果

思路及SQL解释

这个问题可以划分为如下几个子问题,我们可以挨个分析解决:

1. 如何以月份划分

对于一个月份的数据可以如下判断:

date_value >= DATE_ADD(date_value, INTERVAL - DAY(date_value) + 1 DAY)
 AND
data_value <= LAST_DAY(data_value)

解释一下:

DATE_ADD(date_value, INTERVAL - DAY(date_value) + 1 DAY):data_value所在月的第一天,原理为在data_value的基础上加上-DAY(data_value)天数再+1,当然也可以使用DATE_SUB或者去YEAR和MONTH信息再进行拼接;

LAST_DAY(date_value):data_value所在月的最后一天。

一个月的解决了,那么多个月的无非就手写几个范围就可以了(x

当然不能手写这些范围,一方面是很麻烦而且不好看,另一方面是会给mysql带来过多的计算量。

那么如何给12月进行划分呢:

INTERVAL() 函数可以解决我们的问题:

INTERVAL( N , n 1 , n 2 , ⋯   , n 3 N,n_1,n_2,\cdots,n_3 N,n1​,n2​,⋯,n3​),其中 N N N为带判断是数据,后面的 n 1 ∼ n n n_1 \sim n_n n1​∼nn​分别为各个间断点,这个函数的返回值如下,当 N < n 1 N < n1 N<n1返回0,当 n 1 ≤ N < n 2 n_1 \leq N < n_2 n1​≤N<n2​时返回1,当 n 2 ≤ N < n 3 n_2 \leq N < n_3 n2​≤N<n3​时返回2,…,以此类推。

据此,我们可以给一年做一个分段:

 INTERVAL(
            date_value,
            DATE(CONCAT('2022', '-01-01')), # 一月
            DATE(CONCAT('2022', '-02-01')), # 二月
            DATE(CONCAT('2022', '-03-01')), # 三月
            DATE(CONCAT('2022', '-04-01')), # 四月
            DATE(CONCAT('2022', '-05-01')), # 五月
            DATE(CONCAT('2022', '-06-01')), # 六月
            DATE(CONCAT('2022', '-07-01')), # 七月
            DATE(CONCAT('2022', '-08-01')), # 八月
            DATE(CONCAT('2022', '-09-01')), # 九月
            DATE(CONCAT('2022', '-10-01')), # 十月
            DATE(CONCAT('2022', '-11-01')), # 十一月
            DATE(CONCAT('2022', '-12-01')), # 十二月
            DATE(CONCAT('2023', '-01-01')) # 次年一月,防止次年的数据记录进当年12月中
        )

注: 这里其实还有个问题,就是结果会返回去年的数据(0),可以像我一样在外查询里面进行一个年份判断,也可以交给java等检测。

2.获取每月数据

可以使用GROUP BY子句,以INTERVAL的值进行分组(为了保证属于同一个value1的数据,还需要以value1进行分组)。

注:GROUP BY 子句中含有多个参数时,将会是多条这些数据都一样的记录分为一组。

仅仅是做了分组是不够的,我们还需要GROUP_CONCAT()函数来获取一个分组中的数据集。

执行完当前这步,可以获取的结果如下:

3.统计每月数据

在ct这一列中,我们获取的数据是有规律的,比如一个日期中会有两个"-"、两个日期之间以",“分隔。

这里我们选择以”,"为标志,统计出有多少个分隔符,再+1就得到了数据的数量。

至于实现方式,可以使用如下方式:

LENGTH(tmp.ct) - LENGTH(REPLACE(tmp.ct, ',', '')) + 1

4.统计值与月份相对应

取得GROUP_CONCAT获取的第一个日期即可代表这一整个数据所在的月份。

可以使用SUBSTRING_INDEX()函数,它有三个参数,第一个参数为待片取的字符串、第二个参数为分隔符、第三个参数为第几个截取到第几个分隔符。

如此一来:

SUBSTRING_INDEX(tmp.ct, ',', 1)

便可以取到该日期,再使用MONTH函数即可获取对应的月份。

5.总体整合

我这里是使用了一次子查询,子查询获取对应的分组及GROUP_CONCAT数据,再交由外查询进行处理。

结语

这里给出的方案仅仅是一种方案,也许存在着其他更快更好的解决方案但我没有想到,在复杂问题面前一步一步获取小数据是我习惯,这也就使得很可能出现多个嵌套着的子查询。

到此这篇关于如何使用MySQL查询一年中每月的记录数的文章就介绍到这了,更多相关MySQL查询每月记录数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用MySQL查询一年中每月的记录数

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MYSQL使用group by,如何查询出总记录数

比如有这样一条SQL,根据t.user_id,t.report_date两个字段统计这样前端页面能展示数据,但往往需要一个总记录数,在有分页的情况下用到一种解决方法是在外面套一层,然后对其count(*)SELECT COUNT(*) FROM (SELECT
MYSQL使用group by,如何查询出总记录数
2015-05-14

怎么使用PHP查询MySQL数据库中的所有记录

本篇内容介绍了“怎么使用PHP查询MySQL数据库中的所有记录”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、建立数据库连接在使用PHP查
2023-07-05

MySQL如何查询最近几天/月/年的数据

要查询最近几天/月/年的数据,可以使用MySQL的DATE_SUB函数和CURDATE函数来筛选数据。以下是一些示例查询:查询最近7天的数据:SELECT * FROM table_name WHERE date_column >= DA
MySQL如何查询最近几天/月/年的数据
2024-04-09

mysql如何查询一个表中的所有数据

要查询一个表中的所有数据,可以使用以下SQL语句:SELECT * FROM table_name;其中,table_name 是要查询的表的名称。这条SQL语句会返回表中的所有数据。如果要指定查询特定的列,可以将* 替换为列名,多个列名
mysql如何查询一个表中的所有数据
2024-04-20

如何使用SQL语句在MySQL中查询数据

要在MySQL中查询数据,可以使用SELECT语句。以下是一个简单的例子:SELECT * FROM table_name;这将检索指定表中的所有列和行数据。您还可以指定特定的列,如下所示:SELECT column1, column2
如何使用SQL语句在MySQL中查询数据
2024-04-09

如何使用MySQL进行高效的数据查询?

如何使用MySQL进行高效的数据查询?MySQL是一种常用的关系型数据库管理系统,广泛应用于网站开发、数据分析等领域。在实际应用中,进行高效的数据查询对于提升系统性能和用户体验至关重要。本文将介绍如何使用MySQL进行高效的数据查询,并给出
2023-10-22

如何使用 MySQL 查询查找列中特定 id 的字符串计数?

为此,请使用 MySQL 中的 CHAR_LENGTH() 函数。让我们首先创建一个表 -mysql> create table DemoTable(Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,Su
2023-10-22

如何使用SQL语句在MySQL中查询和筛选数据?

如何使用SQL语句在MySQL中查询和筛选数据?MySQL是一种常用的关系型数据库管理系统,它提供了强大的 SQL 查询语言,可以帮助我们方便地查询和筛选数据。本文将介绍如何使用 SQL 语句在 MySQL 中查询和筛选数据,包括使用 SE
如何使用SQL语句在MySQL中查询和筛选数据?
2023-12-17

如何用php查询数据库中最新的一条数据

本篇内容主要讲解“如何用php查询数据库中最新的一条数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用php查询数据库中最新的一条数据”吧!查询数据库中的最新一条数据通常需要以下步骤:连接
2023-07-05

我们如何在 MySQL SELECT 查询中将组函数与非组字段一起使用?

如果我们想在 SELECT 查询中对非分组字段使用分组函数,则必须使用 GROUP BY 子句。一般语法可以如下语法SELECT group_function1,…, non-group-column1,… fr
2023-10-22

如何使用MySQL和Ruby实现一个简单的数据查询分析功能

要使用MySQL和Ruby实现一个简单的数据查询分析功能,首先需要确保已经安装了MySQL数据库和Ruby编程语言。下面是一个简单的步骤指南:1. 安装MySQL数据库:可以从MySQL官方网站下载并安装MySQL数据库。2. 安装Ruby
2023-10-10

编程热搜

目录