Você pode fazer isso em SQL, embora não seja bonito.
select distinct reverse(substring_index(reverse(substring_index(tags, ',', n.n)), ',', 1)) as word
from t cross join
(select 1 as n union all select 2 as n union all select 3 as n union all select 4 as n) n
having word is not null
Você precisa ter certeza de que a subconsulta
n
tem pelo menos o número de palavras em cada tag. Aqui é o SQLFiddle que demonstra isso.
Esta é a junção cruzada dos dados originais com números sequenciais. Em seguida, ele escolhe o enésimo valor das strings das tags, usando
substring_index()
. Para obter o número máximo de tags, você pode fazer:
select max(length(tags) - length(replace(tags, ',', 1))+1
from t