2012-09-10 20 views
118

Mam tabeli tak:Policzyć liczbę wystąpień ciągu w polu VARCHAR?

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

Próbuję dowiedzieć się, jak wrócić ile razy występuje ciąg w każdym opisu użytkownika.

Więc jeśli chcę liczyć ile razy „wartość” wyświetlonym sql oświadczenie powróci to:

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

Czy istnieje jakiś sposób, aby to zrobić? Nie chcę używać php w ogóle, tylko mysql.

+3

Odpowiedzi poniżej pozwolą ci tam dotrzeć. Jednak nie zapomnij użyć ['CHAR_LENGTH()'] (http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_char-length) zamiast ['LENGTH () '] (http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_length) jeśli używasz znaków wielobajtowych. – inhan

+0

Ten wątek również został odebrany w [tutaj] (https://stackoverflow.com/questions/5033047/mysql-query-finding-values-in-a-comma-separated-string/47069224#47069224) – Delickate

Odpowiedz

221

To powinno załatwić sprawę:

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

To rozwiązanie jest niesamowite, właśnie to, czego potrzebowałem! Ale uwaga: funkcja LENGTH() nie jest wielobajtowo bezpieczna i możesz napotkać dziwne błędy.Zamiast tego użyj CHAR_LENGTH() :) –

+0

nie działa, gdy masz w nich słowa zawierające wartość, np. "nie doceniać". Kwerenda również liczy ten wiersz. – chyupa

+0

nie ma różnicy w użyciu 'LENGTH()' i 'CHAR_LENGTH()' podczas dzielenia na ten sam liczący się bajt/znak. @nicogawenda – MohaMad

9

W SQL Server, to jest odpowiedź

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 

Wynik

TITLE DESCRIPTION    Count 
test1 value blah blah value  2 
test2 value test     1 
test3 test test test    0 
test4 valuevaluevaluevaluevalue 5 

nie mam zainstalować MySQL, ale goggled znaleźć odpowiednik len jest LENGTH podczas REPLACE jest podobnie.

więc odpowiednikiem zapytań w MySQL powinny być

SELECT TITLE,DESCRIPTION, (LENGTH(DESCRIPTION) - LENGTH(REPLACE(DESCRIPTION, 'value', '')))/LENGTH('value') AS Count 
FROM <yourTable> 

Proszę dać mi znać, jeśli to dla ciebie pracował również w MySQL.

12

spróbuj tego:

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


SQL Fiddle Demo

1
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 

Dzięki Yannis, Twój solutio n pracował dla mnie i tutaj udostępniam to samo rozwiązanie dla wielu słów kluczowych z zamówieniem i limitem.

1

Oto funkcja, która to zrobi.

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

Nieco prostszy, lecz skuteczniejszy odmianą @yannis rozwiązania:

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

Różnica polega na tym, że należy wymienić „wartość” łańcuch o 1, znak krótszego łańcucha („1234” w tym przypadku). W ten sposób nie trzeba dzielić i zaokrąglać, aby uzyskać wartość całkowitą.

+1

To jest rzeczywiście najlepszy tutaj! Dzięki. –

Powiązane problemy