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 oft eine Zeichenfolge in jeder der BESCHREIBUNGEN vorkommt.
Wenn ich also zählen möchte, wie oft 'Wert' 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 überhaupt kein PHP verwenden, nur MySQL.
CHAR_LENGTH()
anstelle vonLENGTH()
Multibyte-Zeichen zu verwenden.Antworten:
Dies sollte den Trick tun:
quelle
LENGTH()
undCHAR_LENGTH()
während der Aufteilung auf dasselbe Zählbyte / Zeichen. @nicogawendaundevalue
habenvalue
drin, also sollte es gezählt werden. Wenn Sie nur vollständige Wörter zählen möchten, müssen Sie möglicherweise nach 'Wert' suchen oder etwas Komplizierteres wie die Verwendung von Regex verbessern.LENGTH( REPLACE ( LOWER(description), "value", "") )
und sicherstellen, dass "Wert" durch Verwendung von PHP immer in Kleinbuchstaben geschrieben wirdstrtolower()
. PS: Diese obige Lösung hat mir geholfen, meine eigene kleine Suchmaschine aufzubauen und die Ergebnisse mit der Anzahl der Wörter im Text zu gewichten. Vielen Dank!ROUND
hier ist unnötig. Nehmen Sie eine Zeichenfolgex
mit einemn
Vorkommen von an'value
.LENGTH(description) - LENGTH( REPLACE ( description, "value", "") )
wird dir immer gebenn*length("value")
, Tauchen, das nach Länge des Wertes immer eine ganze Zahl hinterlässtn
. Keine NotwendigkeitEine etwas einfachere und effektivere Variante der @ yannis-Lösung:
Der Unterschied besteht darin, dass ich die Zeichenfolge "value" durch eine kürzere Zeichenfolge mit 1 Zeichen ersetze (in diesem Fall "1234"). Auf diese Weise müssen Sie nicht teilen und runden, um einen ganzzahligen Wert zu erhalten.
Verallgemeinerte Version (funktioniert für jede Nadelschnur):
quelle
Versuche dies:
SQL Fiddle Demo
quelle
In SQL Server ist dies die Antwort
Ergebnis
Ich habe MySQL nicht installiert, aber ich habe goggled, um herauszufinden, dass das Äquivalent von LEN LENGTH ist, während REPLACE dasselbe ist.
Die entsprechende Abfrage in MySql sollte also lauten
Bitte lassen Sie mich wissen, ob es auch in MySql für Sie funktioniert hat.
quelle
Hier ist eine Funktion, die das macht.
quelle
Vielen Dank, Yannis, Ihre Lösung hat für mich funktioniert und hier teile ich dieselbe Lösung für mehrere Keywords mit Reihenfolge und Limit.
quelle
Dies ist die MySQL-Funktion unter Verwendung der Raumfahrttechnik (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)) );
quelle