Подсчитайте количество вхождений строки в поле 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>
Ответ 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;