2012-09-10 10 views
118

Ich habe eine Tabelle wie folgt aus:Zählen Sie die Anzahl der Vorkommen einer Zeichenfolge in einem VARCHAR-Feld?

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

Ich versuche, herauszufinden, wie man die Anzahl der zurück eine Zeichenfolge in jedem der Beschreibung des auftritt.

Also, wenn ich die Anzahl der ‚Wert‘ zählen möchten angezeigt wird, die SQL-Anweisung wird diese zurück:

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

Gibt es eine Möglichkeit, dies zu tun? Ich möchte PHP überhaupt nicht benutzen, nur mysql.

+3

Antworten unten erhalten Sie dort. Vergessen Sie jedoch nicht, ['CHAR_LENGTH()'] (http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_char-length) anstelle von ['LENGTH () '] (http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_length), wenn Sie Multibyte-Zeichen verwenden. – inhan

+0

Dieser Thread wurde auch über [hier] beantwortet (https://stackoverflow.com/questions/5033047/mysql-query-finding-values-in-a-comma-separated-string/47069224#47069224) – Delickate

Antwort

221

Dies sollte den Trick:

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

Diese Lösung ist genial, genau was ich brauchte! Beachten Sie jedoch, dass LENGTH() nicht Multi-Byte-sicher ist und Sie möglicherweise auf seltsame Fehler stoßen.Verwenden Sie CHAR_LENGTH() stattdessen :) –

+0

funktioniert nicht, wenn Sie Wörter enthalten, die Wert in ihnen enthalten, z. "unterschätzen". Die Abfrage zählt auch diese Zeile. – chyupa

+0

gibt es keinen Unterschied in der Verwendung von 'LENGTH()' und 'CHAR_LENGTH()', während sie in dasselbe Zählbyte/char aufgeteilt sind. @nicogawenda – MohaMad

9

in SQL Server, ist dies die Antwort

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 

Ergebnis

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

Ich habe MySQL nicht installieren, sondern glotzte das Äquivalent von LEN zu finden ist LENGTH während REPLACE ist gleich.

So ist die äquivalente Abfrage in MySql sollte

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

Bitte lassen Sie mich wissen, ob es für Sie in MySql auch gearbeitet.

12

try this:

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 

Dank Yannis, Ihre solutio n hat für mich funktioniert und hier teile ich die selbe Lösung für mehrere Schlüsselwörter mit der Reihenfolge und dem Limit.

1

Hier ist eine Funktion, die das tun wird.

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

Etwas einfacher, aber wirksame Variation der @yannis Lösung:

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

Der Unterschied ist, daß ich das "Wert" string mit einem 1-char kürzeren String ("1234" ersetzen in diesem Fall). Auf diese Weise müssen Sie nicht teilen und runden, um einen ganzzahligen Wert zu erhalten.

+1

Das ist in der Tat das beste hier! Vielen Dank. –

Verwandte Themen