У меня есть такая таблица:
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.
CHAR_LENGTH()
вместо,LENGTH()
если вы используете многобайтовые символы.Ответы:
Это должно сделать трюк:
источник
LENGTH()
иCHAR_LENGTH()
при разделении на один и тот же счетный байт / символ. @nicogawendaundevalue
естьvalue
это так, это должно быть посчитано. Если вы хотите считать только полные слова, возможно, вам нужно найти «значение» или улучшить что-то более сложное, например, с помощью регулярных выражений.LENGTH( REPLACE ( LOWER(description), "value", "") )
и убедиться, что «значение» всегда в нижнем регистре с помощью PHPstrtolower()
. PS: это решение помогло мне создать собственную маленькую поисковую систему и взвесить результаты по количеству слов в тексте. Спасибо!ROUND
Здесь не нужно. принять строку длиныx
сn
вхождениями'value
.LENGTH(description) - LENGTH( REPLACE ( description, "value", "") )
всегда даст вамn*length("value")
, ныряя, что по длине значения всегда будет оставлять целое числоn
. Нет необходимости округлятьНемного проще и эффективнее вариант решения @yannis:
Разница в том, что я заменяю строку «value» на более короткую строку на 1 символ (в данном случае «1234»). Таким образом, вам не нужно делить и округлять, чтобы получить целочисленное значение.
Обобщенная версия (работает для каждой игольной струны):
источник
попробуй это:
SQL Fiddle Demo
источник
В SQL SERVER это ответ
результат
У меня не установлена MySQL, но я обнаружил, что Эквивалент LEN - это ДЛИНА, а ЗАМЕНА - то же самое.
Таким образом, эквивалентный запрос в MySql должен быть
Пожалуйста, дайте мне знать, если это работает для вас в MySql.
источник
Вот функция, которая сделает это.
источник
Спасибо Яннис, ваше решение сработало для меня, и здесь я делюсь тем же решением для нескольких ключевых слов с порядком и лимитом.
источник
Это функция 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)) );
источник