나는 이와 같은 테이블을 가지고있다 :
TITLE | DESCRIPTION
------------------------------------------------
test1 | value blah blah value
test2 | value test
test3 | test test test
test4 | valuevaluevaluevaluevalue
각 DESCRIPTION에서 문자열이 발생하는 횟수를 반환하는 방법을 알아 내려고합니다.
따라서 ‘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 만 사용하고 싶다.
답변
트릭을 수행해야합니다.
SELECT
title,
description,
ROUND (
(
LENGTH(description)
- LENGTH( REPLACE ( description, "value", "") )
) / LENGTH("value")
) AS count
FROM <table>
답변
@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>
답변
이 시도:
select TITLE,
(length(DESCRIPTION )-length(replace(DESCRIPTION ,'value','')))/5 as COUNT
FROM <table>
SQL 바이올린 데모
답변
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과 동등한 것은 LENGTH 이고 REPLACE 는 동일 하다는 것을 알았습니다 .
따라서 MySql의 동등한 쿼리는
SELECT TITLE,DESCRIPTION, (LENGTH(DESCRIPTION) - LENGTH(REPLACE(DESCRIPTION, 'value', '')))/LENGTH('value') AS Count
FROM <yourTable>
MySql에서도 효과가 있었는지 알려주십시오.
답변
이를 수행하는 기능은 다음과 같습니다.
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;
답변
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, 귀하의 솔루션이 저를 위해 일했으며 여기에 여러 키워드에 대해 동일한 솔루션을 순서와 제한으로 공유하고 있습니다.
답변
이것은 공간 기술을 사용하는 mysql 함수입니다 (mysql 5.0 + 5.5로 테스트).
CREATE FUNCTION count_str( haystack TEXT, needle VARCHAR(32))
RETURNS INTEGER DETERMINISTIC
RETURN LENGTH(haystack) - LENGTH( REPLACE ( haystack, needle, space(char_length(needle)-1)) );