Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 计算VARCHAR字段中字符串的出现次数?_Mysql_Sql - Fatal编程技术网

Mysql 计算VARCHAR字段中字符串的出现次数?

Mysql 计算VARCHAR字段中字符串的出现次数?,mysql,sql,Mysql,Sql,我有一张这样的桌子: TITLE | DESCRIPTION ------------------------------------------------ test1 | value blah blah value test2 | value test test3 | test test test test4 | valuevaluevaluevaluevalue 我试图找出如何返

我有一张这样的桌子:

TITLE          |   DESCRIPTION
------------------------------------------------
test1          |   value blah blah value
test2          |   value test
test3          |   test test test
test4          |   valuevaluevaluevaluevalue
我试图找出如何返回字符串在每个描述中出现的次数

因此,如果我想计算“value”出现的次数,sql语句将返回:

TITLE          |   DESCRIPTION                  |   COUNT
------------------------------------------------------------
test1          |   value blah blah value        |   2
test2          |   value test                   |   1
test3          |   test test test               |   0
test4          |   valuevaluevaluevaluevalue    |   5

有没有办法做到这一点?我根本不想使用php,只想使用mysql。

在SQL SERVER中,这就是答案

Declare @t table(TITLE VARCHAR(100), DESCRIPTION VARCHAR(100))

INSERT INTO @t SELECT 'test1', 'value blah blah value' 
INSERT INTO @t SELECT 'test2','value test' 
INSERT INTO @t SELECT 'test3','test test test' 
INSERT INTO @t SELECT 'test4','valuevaluevaluevaluevalue' 


SELECT TITLE,DESCRIPTION,Count = (LEN(DESCRIPTION) - LEN(REPLACE(DESCRIPTION, 'value', '')))/LEN('value') 

FROM @t
结果

TITLE   DESCRIPTION               Count
test1   value blah blah value        2
test2   value test                   1
test3   test test test               0
test4   valuevaluevaluevaluevalue    5
我没有安装MySQL,但Goggle发现了与LEN相同的版本

因此,MySql中的等效查询应该是

SELECT TITLE,DESCRIPTION, (LENGTH(DESCRIPTION) - LENGTH(REPLACE(DESCRIPTION, 'value', '')))/LENGTH('value') AS Count
FROM <yourTable>
选择标题、描述、(长度(描述)-LENGTH(替换(描述,'value',''))/LENGTH('value')作为计数
从…起

请让我知道它在MySql中是否也适用于您。

这应该可以做到:

SELECT 
    title,
    description,    
    ROUND (   
        (
            LENGTH(description)
            - LENGTH( REPLACE ( description, "value", "") ) 
        ) / LENGTH("value")        
    ) AS count    
FROM <table> 
选择
标题
描述
圆形(
(
长度(说明)
-长度(替换(说明,“值”、“”)
)/LENGTH(“值”)
)作为伯爵
从…起
试试这个:

 select TITLE,
        (length(DESCRIPTION )-length(replace(DESCRIPTION ,'value','')))/5 as COUNT 
  FROM <table> 
选择标题,
(长度(描述)-长度(替换(描述,'value','')/5作为计数
从…起


谢谢Yannis,你的解决方案对我有效,我在这里为多个关键字共享相同的解决方案,有顺序和限制。

这里有一个函数可以做到这一点

CREATE FUNCTION count_str(haystack TEXT, needle VARCHAR(32))
  RETURNS INTEGER DETERMINISTIC
  BEGIN
    RETURN ROUND((CHAR_LENGTH(haystack) - CHAR_LENGTH(REPLACE(haystack, needle, ""))) / CHAR_LENGTH(needle));
  END;

@yannis解决方案更简单、更有效的变化:

SELECT 
    title,
    description,    
    CHAR_LENGTH(description) - CHAR_LENGTH( REPLACE ( description, 'value', '1234') ) 
        AS `count`    
FROM <table> 
选择
标题
描述
字符长度(描述)-字符长度(替换(描述,'value','1234'))
作为“伯爵”
从…起
不同之处在于,我将“value”字符串替换为一个短1个字符的字符串(本例中为“1234”)。这样,您不需要进行除法和取整来获得整数值

通用版本(适用于每根针串):

SET@needle='value';
选择
描述
字符长度(描述)-字符长度(替换(描述,@指针,空格(长度(@指针)-1)))
作为“伯爵”
从…起

这是使用空间技术的mysql函数(使用mysql 5.0+5.5进行测试):

创建函数count_str(haystack文本,指针VARCHAR(32))
返回整数
返回长度(干草堆)-长度(替换(干草堆、针、空间(字符长度(针)-1));

下面的回答将帮助您达到目的。但是,如果您使用的是多字节字符,请不要忘记使用而不是。这个问题也得到了回答:嗨,我该如何使用sqlserver查询?长度([field])-LENGTH(替换([field],“[char\u to\u find],”),这个解决方案非常棒,正是我所需要的!但请注意,LENGTH()不是多字节安全的,您可能会遇到奇怪的错误。使用CHAR_LENGTH()代替:)当被划分为相同的计数字节/字符时,使用
LENGTH()
CHAR_LENGTH()
没有区别@nicogawenda@chyupa
undevalue
中包含
value
,因此应该对其进行计数。如果您只想计算完整的单词,可能需要搜索“value”或更复杂的东西,如使用regex。请注意,当您搜索包含大写字母的单词的文本时(如德语,所有名词都用大写字母书写),您会遇到错误的计数。“替换”仅替换完全匹配的项。要考虑所有需要更改的单词:<代码>长度(替换(下(描述)”、“值”、“”)<代码>,并确保“值”始终使用PHP<代码> StrutWORE()/<代码>。PS:上述解决方案帮助我建立了自己的小型搜索引擎,并根据文本中的字数对搜索结果进行加权。谢谢此处的
是不必要的。假设一个长度为
x
的字符串,其中
n
出现了
值<代码>长度(描述)-长度(替换(描述,“值”和“”)
将始终为您提供
n*LENGTH(“值”)
,按值的长度潜水将始终保留一个整数
n
。不需要舍入长度不是二进制安全的,可以使用char_length()+1实现,尽管我通常更喜欢明显的实现,即不需要额外解释的实现,即使它们看起来不那么优雅。
SELECT 
    title,
    description,    
    CHAR_LENGTH(description) - CHAR_LENGTH( REPLACE ( description, 'value', '1234') ) 
        AS `count`    
FROM <table> 
SET @needle = 'value';
SELECT 
    description,    
    CHAR_LENGTH(description) - CHAR_LENGTH(REPLACE(description, @needle, SPACE(LENGTH(@needle)-1))) 
        AS `count`    
FROM <table>