it-swarm.com.de

Zählen Sie die Anzahl der Vorkommen einer Zeichenfolge in einem VARCHAR-Feld.

Ich habe einen Tisch wie diesen:

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

Ich versuche herauszufinden, wie man die Häufigkeit zurückgibt, wie oft eine Zeichenfolge in jeder BESCHREIBUNG auftritt.

Wenn ich also zählen möchte, wie oft "value" angezeigt wird, gibt die SQL-Anweisung Folgendes 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 verwenden, nur MySQL.

147
Geekman

Das sollte den Trick tun:

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

versuche dies:

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


SQL Fiddle Demo

14
Joe G Joseph

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 keine MySQL-Installation, aber ich habe geguckt, um herauszufinden, dass das Äquivalent von LEN LENGTH ist, während ERSETZEN dasselbe ist.

Die entsprechende Abfrage in MySql sollte also sein

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

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

10
Niladri Biswas

Eine etwas einfachere und effektivere Variante der @ yannis-Lösung:

SELECT 
    title,
    description,    
    CHAR_LENGTH(description) - CHAR_LENGTH( REPLACE ( description, 'value', '1234') ) 
        AS `count`    
FROM <table> 

Der Unterschied ist, dass ich die Zeichenfolge "value" durch eine 1 Zeichen lange Zeichenfolge (in diesem Fall "1234") ersetze. Auf diese Weise müssen Sie nicht teilen und runden, um einen ganzzahligen Wert zu erhalten.

Verallgemeinerte Version (funktioniert für jede Nadelkette):

SET @needle = 'value';
SELECT 
    description,    
    CHAR_LENGTH(description) - CHAR_LENGTH(REPLACE(description, @needle, SPACE(LENGTH(@needle)-1))) 
        AS `count`    
FROM <table> 
10
gaborsch
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

Danke Yannis, Ihre Lösung hat für mich funktioniert und hier teile ich dieselbe Lösung für mehrere Keywords mit Reihenfolge und Limit.

Hier ist eine Funktion, die das tut.

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;
1
michaelbn

Dies ist die mysql-Funktion, die die Space-Technik verwendet (getestet mit 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)) );

0
jfx