Den här lösningen verkar göra jobbet (stul nästan ordagrant från denna sida
). Det kräver en auxiliary
tabell, fylld med sekventiella nummer från 1 till åtminstone det förväntade antalet distinkta ord. Detta är ganska viktigt för att kontrollera att hjälptabellen är tillräckligt stor, annars blir resultaten felaktiga (visar inget fel).
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(maintable.comment, ' ', auxiliary.id), ' ', -1) AS word,
COUNT(*) AS frequency
FROM maintable
JOIN auxiliary ON
LENGTH(comment)>0 AND SUBSTRING_INDEX(SUBSTRING_INDEX(comment, ' ', auxiliary.id), ' ', -1)
<> SUBSTRING_INDEX(SUBSTRING_INDEX(comment, ' ', auxiliary.id-1), ' ', -1)
GROUP BY word
HAVING word <> ' '
ORDER BY frequency DESC;
Detta tillvägagångssätt är så ineffektivt som man kan vara, eftersom det inte kan använda något index.
Som ett alternativ skulle jag använda en statistiktabell som jag skulle hålla uppdaterad med triggers. Initiera kanske statistiktabellen med ovanstående.