Това решение изглежда върши работата (откраднато почти дословно от тази страница
). Изисква auxiliary
таблица, изпълнена с последователни номера от 1 до поне очаквания брой отделни думи. Това е доста важно, за да се провери дали спомагателната таблица е достатъчно голяма, или резултатите ще бъдат грешни (без грешка).
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;
Този подход е толкова неефективен, колкото може да бъде, защото не може да използва никакъв индекс.
Като алтернатива бих използвал таблица със статистически данни, която ще поддържам в крак с тригерите. Може би инициализирайте таблицата със статистически данни с горното.