MySQL häufig benutzte Wörter Ranking

RichardS

Neuer Benutzer
Beiträge
1
Hallo,
ich weiß die Frage ist für den ein oder anderen lächerlich, aber ich bin leider noch ziemlich neu was das Thema SQL angeht und deshalb hoffe ich das mir doch der ein oder andere helfen kann.

Und zwar möchte ich eine Auswertung auf meinem MySQL Server fahren:
Die am häufigsten benutzten Wörter und das in einem Ranking ausgeben.

Ich habe mir dafür den Befehl SELECT Count(*) FROM ticket WHERE title LIKE '%Test%' ausgesucht und möchte jetzt irgendwie eine Art Wörterbuch oder alle in der Datenbank genutzten Wörter so durchlaufen lassen.
Wenn dann am Ende das ganze noch nach Häufigkeit sortiert wird, wäre es ideal.

Vielen Dank euch
Richard
 
Werbung:
Unter MySQL kannst du das nur mit Schleifen realisieren, das ist nicht wirklich eine gute DB dafür. Hier mal quick and dirty ein Beispiel wie es gehen könnte (benutze normal MSSQL):
Code:
DECLARE   @pk UNIQUEIDENTIFIER,
     @spalte VARCHAR(1000)

DECLARE   [cursor] CURSOR FOR
SELECT   pk,
     spalte
FROM   tabelle

OPEN   [cursor] 
FETCH NEXT FROM [cursor] INTO @pk,@spalte

WHILE   @@FETCH_STATUS = 0
BEGIN
   SET     @spalte = ltrim(rtrim(@spalte)) + ' '
   IF     @spalte IS NOT NULL
   AND     @spalte NOT LIKE '%  %'
   BEGIN
     WHILE   @spalte LIKE '% %'
     BEGIN
       INSERT INTO tbl_woerter(fk_tabelle,wort) VALUES(@pk,left(@spalte,charindex(' ',@spalte)-1))
       SET     @spalte = right(@spalte,len(@spalte)-charindex(' ',@spalte)+1)
     END
   END

   FETCH NEXT FROM [cursor] INTO @pk,@spalte
END 

CLOSE   [cursor] 
DEALLOCATE [cursor]

SELECT   wort,
     count(*) AS anzahl
FROM   tbl_woerter
GROUP BY wort
ORDER BY count(*) DESC
Erfordert natürlich noch das Anlegen der Wörter Tabelle und es dauert! Wenn das ganze regelmäßig aktualisiert werden soll wirds schwierig und ein echtes Performance-Problem.
 
Werbung:
einfacher ginge das in PostgreSQL. Hier eine kurze Demo mit einer Tabelle foo, welche Texte enthält:

Code:
test=# select * from foo;
 id |  t   
----+-----------------------
  1 | ein kleiner text
  2 | noch ein kleiner text
  3 | noch ein text
(3 rows)

test=# select word, count(1) from (select regexp_split_to_table(t, E'\\s+') as word from foo) my_words group by word order by count desc;
  word  | count
---------+-------
 ein  |  3
 text  |  3
 noch  |  2
 kleiner |  2
(4 rows)
 
Zurück
Oben