Voici une solution utilisant uniquement une requête :
SELECT SUM(total_count) as total, value
FROM (
SELECT count(*) AS total_count, REPLACE(REPLACE(REPLACE(x.value,'?',''),'.',''),'!','') as value
FROM (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.sentence, ' ', n.n), ' ', -1) value
FROM table_name t CROSS JOIN
(
SELECT a.N + b.N * 10 + 1 n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
ORDER BY n
) n
WHERE n.n <= 1 + (LENGTH(t.sentence) - LENGTH(REPLACE(t.sentence, ' ', '')))
ORDER BY value
) AS x
GROUP BY x.value
) AS y
GROUP BY value
Voici le violon complet :http://sqlfiddle.com/#!2/17481a/ 1
Nous faisons d'abord une requête pour extraire tous les mots comme expliqué ici
par @peterm (suivez ses instructions si vous souhaitez personnaliser le nombre total de mots traités). Ensuite, nous convertissons cela en une sous-requête, puis nous COUNT
et GROUP BY
la valeur de chaque mot, puis faites une autre requête en plus pour GROUP BY
mots non groupés cas où des signes accompagnés pourraient être présents. c'est-à-dire :bonjour =bonjour ! avec un REPLACE