[mysql] VARCHAR 필드에서 문자열의 발생 횟수를 세시겠습니까?

나는 이와 같은 테이블을 가지고있다 :

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)) );