Mysql
 sql >> Database >  >> RDS >> Mysql

Conta la frequenza di ogni parola

Questa soluzione sembra fare il lavoro (rubata quasi alla lettera da questa pagina ). Richiede un auxiliary tabella, riempita con numeri sequenziali da 1 almeno al numero previsto di parole distinte. Questo è abbastanza importante per verificare che la tabella ausiliaria sia sufficientemente grande, altrimenti i risultati saranno errati (non mostrano errori).

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;

SQL Fiddle

Questo approccio è inefficiente come uno può essere, perché non può utilizzare alcun indice.

In alternativa, userei una tabella delle statistiche che terrei aggiornata con i trigger. Forse inizializza la tabella delle statistiche con quanto sopra.