Her er en løsning, der kun bruger en forespørgsel:
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
Her er den fulde fungerende violin:http://sqlfiddle.com/#!2/17481a/ 1
Først laver vi en forespørgsel for at udtrække alle ord som forklaret her
af @peterm(følg hans instruktioner, hvis du vil tilpasse det samlede antal behandlede ord). Så konverterer vi det til en underforespørgsel, og så COUNT
og GROUP BY
værdien af hvert ord, og lav derefter endnu en forespørgsel oven i det til GROUP BY
ikke grupperede ord tilfælde, hvor ledsagede tegn kan være til stede. dvs:hej =hej! med en REPLACE