Mam taki stół:
TITLE | DESCRIPTION
------------------------------------------------
test1 | value blah blah value
test2 | value test
test3 | test test test
test4 | valuevaluevaluevaluevalue
Próbuję dowiedzieć się, jak zwrócić liczbę wystąpień ciągu w każdym z OPISÓW.
Tak więc, jeśli chcę policzyć, ile razy pojawia się `` wartość '', instrukcja sql zwróci to:
TITLE | DESCRIPTION | COUNT
------------------------------------------------------------
test1 | value blah blah value | 2
test2 | value test | 1
test3 | test test test | 0
test4 | valuevaluevaluevaluevalue | 5
Czy jest na to sposób? W ogóle nie chcę używać php, tylko mysql.
CHAR_LENGTH()
zamiast,LENGTH()
jeśli używasz znaków wielobajtowych.Odpowiedzi:
To powinno załatwić sprawę:
źródło
LENGTH()
iCHAR_LENGTH()
podczas dzielenia na ten sam licznik bajtów / znaków. @nicogawendaundevalue
mavalue
w niej więc to należy policzyć. Jeśli chcesz liczyć tylko całe słowa, być może musisz wyszukać „wartość” lub lepiej coś bardziej skomplikowanego, na przykład użycie wyrażenia regularnego.LENGTH( REPLACE ( LOWER(description), "value", "") )
i upewnij się, że „wartość” jest zawsze pisana małą literą, używając PHPstrtolower()
. PS: Powyższe rozwiązanie pomogło mi zbudować własną małą wyszukiwarkę i zważyć wyniki według liczby słów w tekście. Dzięki!ROUND
Tutaj jest zbędne. załóż ciąg długościx
zn
wystąpieniami'value
.LENGTH(description) - LENGTH( REPLACE ( description, "value", "") )
zawsze da cin*length("value")
, nurkowanie, które według długości zawsze pozostawi liczbę całkowitąn
. Nie trzebaNieco prostsza i bardziej efektywna odmiana rozwiązania @yannis:
Różnica polega na tym, że zastępuję ciąg „wartość” krótszym łańcuchem o 1 znaku (w tym przypadku „1234”). W ten sposób nie musisz dzielić i zaokrąglać, aby uzyskać wartość całkowitą.
Wersja uogólniona (działa dla każdej igły):
źródło
Spróbuj tego:
SQL Fiddle Demo
źródło
W SQL SERVER to jest odpowiedź
Wynik
Nie mam instalacji MySQL, ale przeszukałem go, aby znaleźć odpowiednik LEN to LENGTH, podczas gdy REPLACE jest takie samo.
Zatem równoważne zapytanie w MySql powinno brzmieć
Daj mi znać, jeśli to zadziałało również w MySql.
źródło
Oto funkcja, która to zrobi.
źródło
Dzięki Yannis, Twoje rozwiązanie zadziałało dla mnie i tutaj udostępniam to samo rozwiązanie dla wielu słów kluczowych z kolejnością i limitem.
źródło
Oto funkcja mysql wykorzystująca technikę kosmiczną (testowana z 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)) );
źródło