Mysql数据库一个字段内多个值如何统计个数

Mysql数据库一个字段内多个值如何统计个数,第1张

CREATE TABLE person (

    name  varchar(20)

);

INSERT INTO person VALUES ('a,b,c');

INSERT INTO person VALUES ('a,b');

INSERT INTO person VALUES ('a,c');

DELIMITER //

DROP FUNCTION GetTextCount //

/

-- 获取字符串中有几个部分

/

CREATE FUNCTION GetTextCount(pSourceText  VARCHAR(255),  pDivChar  CHAR(1))

RETURNS TINYINT

BEGIN

-- 预期结果 

DECLARE vResult TINYINT;

-- 当前逗号的位置

DECLARE vIndex INT;

-- 前一个逗号的位置

DECLARE vPrevIndex INT;

-- 结果的初始值

SET vResult = 1;

-- 查询第一个 逗号的位置

SET vIndex = INSTR(pSourceText, pDivChar);

IF vIndex = 0 THEN

-- 参数中没有逗号,直接返回

RETURN vResult;

END IF;

-- 初始化情况,前一个逗号不存在

SET vPrevIndex = 0;

-- 循环处理。

WHILE vIndex > 0 DO

-- 结果递增

SET vResult = vResult + 1;

-- 前一个逗号的位置 = 当前逗号的位置

SET vPrevIndex = vIndex;

-- 查询下一个逗号的位置

SET vIndex = LOCATE(pDivChar,  pSourceText,  vPrevIndex + 1);

END WHILE;

-- 返回结果

RETURN vResult;

END;

//

DROP FUNCTION GetTextValue //

/

-- 获取字符串中具体某一个部分的数据

/

CREATE FUNCTION GetTextValue(pSourceText  VARCHAR(255),  pDivChar  CHAR(1), pIndex  TINYINT)

RETURNS VARCHAR(255) 

BEGIN

-- 预期结果 

DECLARE vResult VARCHAR(255);

IF pIndex = 1 THEN

SELECT SUBSTRING_INDEX(pSourceText,  pDivChar,  1)  INTO  vResult;

ELSE

SELECT 

REPLACE(

SUBSTRING_INDEX(pSourceText,  pDivChar,  pIndex),

CONCAT(SUBSTRING_INDEX(pSourceText,  pDivChar,  pIndex - 1) , pDivChar),

'') INTO  vResult;

END IF;

-- 返回

RETURN vResult;

END;

//

DELIMITER ;

SELECT

GetTextValue(tname, ',', MaxNumNo) AS `名称`,

    COUNT() AS `个数`

FROM

person t,

(SELECT 1 No UNION ALL

 SELECT 2 No UNION ALL

 SELECT 3 No UNION ALL

 SELECT 4 No UNION ALL

 SELECT 5 No ) MaxNum

WHERE

GetTextCount(tname, ',') >= MaxNumNo

GROUP BY

    GetTextValue(tname, ',', MaxNumNo);

+------+------+

| 名称 | 个数 |

+------+------+

| a    |    3 |

| b    |    2 |

| c    |    2 |

+------+------+

3 rows in set (001 sec)

SELECT COUNT() AS total FROM `logs` WHERE FROM_UNIXTIME(`create_time`,'%Y-%m')='2015-06'

   在统计数据的需求中很容易出现按照天来统计数据的场景,有时某一列的维度在那天并没有产生数据,但是又没有一列是可以确保每天都是有数据的,由于mysql中并没有fulljoin这样的关联方式,在这种情况下关联查询就有些费劲,解决的办法也是多种多样,毕竟条条大路通罗马嘛,其他的就不说了,这里介绍一种相对方便的方法。

   产生一个足够长的时间列,这个列要能够包含想要统计的所有日期。这个思路的实现很泛,可以创建一个日期的临时表,然后将想要查的日期插入,抛开创建表比较麻烦之外,一般在职能比较完善的公司,生产环境创建表或者修改数据是需要交给专门的DBA去 *** 作的,各种流程。。。相对这个较简单的一种方式就是创建存储过程,然后产生时间列,这也是一种解决办法。

   我的思路是先定义一个时间变量并初始化,然后和某个数据足够多的表关联查询获取时间列,这个表一般选取某张要查的表即可,数据条数只要超过需要查询的条数即可,足够即可,太多就是浪费,降低查询效率。

   比如说我要查询2018-01-10到2018-01-20每天的数据,那么就可以写成

   其中,cdate是我定义的一个时间变量,初始化的值是2018-01-09,因为在外面那部分执行之后值已经加1了,已经不是2018-01-10了;data_t是我关联产生记录的实体表,这个表只有一个要求,就是能帮我们产生足够的时间列条数,后面的limit 15是帮助我产生15条时间记录,可以换成其他条件;生成的t0其实就是15条全为2018-01-09的记录,外面的查询在每扫描一条t0的记录就会加1天,这样就会产生连续的时间列;WHERE后面是最终查询的截止条件,换成其他的也可以。

关联其他表举例:

查询从2018-01-10到当前日期每天的统计数据

  通过上面的例子我想大部分人应该可以灵活变化了,比如查询多少天内每天的统计数据,某几个月内每月的统计数据等等,通过修改上面给的例子里面的sql完全可以做到,可以说这种思路就是个‘万能模板’,希望本文能够帮到大家。

以上就是关于Mysql数据库一个字段内多个值如何统计个数全部的内容,包括:Mysql数据库一个字段内多个值如何统计个数、php mysql 获取 统计 指定月份的数据、mysql按照每天/每月等统计数据(连续不间断,当天/月没有数据为0)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9590172.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存