Подсчитайте количество вхождений строки в поле VARCHAR?

У меня есть таблица вроде этого:

TITLE          |   DESCRIPTION
------------------------------------------------
test1          |   value blah blah value
test2          |   value test
test3          |   test test test
test4          |   valuevaluevaluevaluevalue

Я пытаюсь выяснить, как вернуть число раз, когда строка появляется в каждом из DESCRIPTION.

Итак, если я хочу подсчитать количество раз "значение", то оператор sql вернет это:

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

Есть ли способ сделать это? Я не хочу использовать php вообще, просто mysql.

Ответ 1

Это должно сделать трюк:

SELECT 
    title,
    description,    
    ROUND (   
        (
            LENGTH(description)
            - LENGTH( REPLACE ( description, "value", "") ) 
        ) / LENGTH("value")        
    ) AS count    
FROM <table> 

Ответ 2

попробуйте следующее:

 select TITLE,
        (length(DESCRIPTION )-length(replace(DESCRIPTION ,'value','')))/5 as COUNT 
  FROM <table> 


SQL Fiddle Demo

Ответ 3

В 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.

Ответ 4

Немного более простая и эффективная вариация решения @yannis:

SELECT 
    title,
    description,    
    LENGTH(description) - LENGTH( REPLACE ( description, "value", "1234") ) 
        AS count    
FROM <table> 

Разница в том, что я заменяю строку "значение" на более короткую строку с 1 символом ("1234" в этом случае). Таким образом, вам не нужно делиться и округлять, чтобы получить целочисленное значение.

Ответ 5

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, ваше решение сработало для меня, и здесь я использую одно и то же решение для нескольких ключевых слов с порядком и ограничением.

Ответ 6

Вот функция, которая сделает это.

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;