Когда вы застряли в таком ужасном формате данных, вы можете что-то с ним сделать. Таблица чисел может помочь, но вот пример, который будет извлекать до первых 3 элементов:
select substring_index(substring_index(tags, '|', n.n), '|', -1) as tag, count(*)
from (select 1 as n union all
select 2 as n union all
select 3 as n
) n join
t
on n.n <= length(tags) - length(replace(t.tags, '|', '')) + 1
group by tag;
Что это делает? Предложение on
гарантирует, что в строке есть как минимум теги n
для данного значения n
(большие значения отфильтровываются).
Две функции substring_index()
извлекают n-й тег из списка. И тогда происходит агрегация.