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@chyupaundevalue
中包含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>