我有一个这样的表格:
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,但眼睛找到LEN的等效长度,而替换是相同的。
所以MySql中的等效查询应该是
SELECT TITLE,DESCRIPTION, (LENGTH(DESCRIPTION) - LENGTH(REPLACE(DESCRIPTION, 'value', '')))/LENGTH('value') AS Count
FROM <yourTable>
请让我知道它是否适用于MySql也。
SELECT
id,
jsondata,
ROUND (
(
LENGTH(jsondata)
- LENGTH( REPLACE ( jsondata, "sonal", "") )
) / LENGTH("sonal")
)
+
ROUND (
(
LENGTH(jsondata)
- LENGTH( REPLACE ( jsondata, "khunt", "") )
) / LENGTH("khunt")
)
AS count1 FROM test ORDER BY count1 DESC LIMIT 0, 2
谢谢Yannis,你的解决方案为我工作,在这里我分享相同的解决方案,多个关键字的顺序和限制。
@yannis解决方案的一个更简单、更有效的变种:
SELECT
title,
description,
CHAR_LENGTH(description) - CHAR_LENGTH( REPLACE ( description, 'value', '1234') )
AS `count`
FROM <table>
不同之处在于,我将“value”字符串替换为一个1字符的短字符串(在本例中为“1234”)。这样你就不需要进行除法和四舍五入来得到一个整数值。
通用版(适用于所有针串):
SET @needle = 'value';
SELECT
description,
CHAR_LENGTH(description) - CHAR_LENGTH(REPLACE(description, @needle, SPACE(LENGTH(@needle)-1)))
AS `count`
FROM <table>
在大多数情况下,这些函数分别是LENGTH和REPLACE (SQL Server用户将使用内置函数LEN而不是LENGTH):
示例:计算字符串“10,CLARK,MANAGER”中逗号的个数。
select (length('10,CLARK,MANAGER')-
length(replace('10,CLARK,MANAGER',',','')))/length(',')
as cnt from t1