Предположительно, вы хотите сгруппировать все категории, кроме "Любовь", "Грустно" и "Сердитый", в уникальную группу, которая называется "Другое".
Если это так, вы можете использовать case
выражение:
select
case
when category in ('Love', 'Sad', 'Angry') then category
else 'Other'
end new_category,
count(*) cnt
from categories_like
group by new_category
order by (new_category = 'Other'), cnt desc
Обратите внимание, что предложение order by
в запросе ставит категорию "Другое" в последнюю очередь.
Если вы хотите динамику c топ 3 из категорий с последующим общим подсчетом во всех остальных категориях, это немного отличается. Предполагая MySQL 8.0, вы можете использовать функцию ранжирования:
select case when rn <= 3 then category else 'Other' end new_category, sum(cnt) cnt
from (
select category, count(*) cnt, rank() over(order by count(*) desc) rn
from categories_like
group by category
) t
group by new_category
order by (new_category = 'Other'), cnt desc
В более ранних версиях я бы предложил union all
:
(
select category new_category, count(*) cnt
from categories_like
group by category
order by cnt desc
limit 3
)
union all (
select 'Other', sum(cnt)
from (
select category, count(*) cnt
from categories_like
group by category
order by cnt desc
limit 4, 1000
) t
)
order by (new_category = 'Other'), cnt desc
Это предполагает, что есть не более 1000 категорий; при необходимости вы можете увеличить смещение подзапроса.