mysql中怎么统计某字段里某个字符的个数

mysql中怎么统计某字段里某个字符的个数,第1张

CREATE  function [dbo].[GetCharIndexNum](@findstring varchar(max),@string varchar(max))

returns int

AS

BEGIN

   declare @location int , --要找的字符位置

           @num int  --要找的字符出现的次数

   

   set @num =0

   set @location = charindex (@findstring,@string)

   while @location >0  ---字符串中存在要找的字符

     begin

      set @num =@num +1

      set @string =substring(@string,@location+1,len(@string))

      set @location = charindex (@findstring,@string)

    end

return @num

END

--举个例子调用这个标量值函数 select   [dbo].[GetCharIndexNum]('5','abc5ab5')

返回值2,5这个字符出现了2次

如果你要达到你说的这种效果,需要对数据库表进行重新设计,你现在这种设计不合理!

如果无法改变数据表的话,就需要PHP来进行处理,这需要把数据表里的所有行全取出来,然后根据切开的单个值组成数组,统计数组里值的个数,再排名。

下面简单的写一下代码,未经测试,主要看解决思路

$rank = $_pie = array()

$result = mysql_query(‘‘SELECT * FROM table’’)// table为你实际数据表名称

while ($row = mysql_fetch_assoc($result))

{

if (!empty($row['code']))

{

$_pie = explode(',', $row['code'])

foreach ($_pie as $_v) {

$rank[$_v]++// 统计加1

}

}

}

if (!empty($rank))

{

rsort($rank)// 排序

$index = 0

foreach ($rank as $key =>$val) {

$index++

echo $index . "\t" . $key . "\t" . $val . "\n"// 输出样式

}

}

以上php方式应该可以达到你想要的结果,但不能做为实际生产解决方式,因为如果数据表里的数据多的话,这样做是非常不理想的,所以建议重新设计数据表!!

如你描述,跟网站中热门标签所需效果差不多,可以参考一些开源程序中热门标签的解决方案!!

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(t.name, ',', MaxNum.No) 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(t.name, ',') >= MaxNum.No

GROUP BY

    GetTextValue(t.name, ',', MaxNum.No)

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

| 名称 | 个数 |

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

| a    |    3 |

| b    |    2 |

| c    |    2 |

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

3 rows in set (0.01 sec)


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

原文地址: http://outofmemory.cn/zaji/7181782.html

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

发表评论

登录后才能评论

评论列表(0条)

保存