Esta solución parece hacer el trabajo (robada casi literalmente de esta página
). Requiere un auxiliary
tabla, llena de números secuenciales desde 1 hasta al menos el número esperado de palabras distintas. Esto es muy importante para verificar que la tabla auxiliar sea lo suficientemente grande, o los resultados serán incorrectos (no mostrarán ningún error).
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;
Este enfoque es tan ineficiente como uno puede ser, porque no puede usar ningún índice.
Como alternativa, usaría una tabla de estadísticas que mantendría actualizada con disparadores. Tal vez inicialice la tabla de estadísticas con lo anterior.