Вы должны исправить свою структуру данных.Было бы лучше иметь одну строку для каждого идентификатора и номера.
Это будет выглядеть сложно.Что необычно, я начну с представления (MySQL не поддерживает CTE):
create view better_data as
select id, number1 as num, 1 as which from tab union all
select id, number2 as num, 2 as which from tab union all
select id, number3 as num, 3 as which from tab union all
select id, number4 as num, 4 as which from tab union all
select id, number5 as num, 5 as which from tab;
Затем вы можете сгенерировать все тройки, используя:
select distinct bd1.num, bd2.num, bd3.num
from better_data bd1 cross join
better_data bd2 cross join
better_data bd3
where bd1.num < bd2.num and bd2.num < bd3.num;
Теперь вы можетепосчитайте их с агрегацией:
select triples.num1, triples.num2, triples.num3, count(*) as cnt
from (select distinct bd1.num as num1, bd2.num as num2, bd3.num as num3
from better_data bd1 cross join
better_data bd2 cross join
better_data bd3
where bd1.num < bd2.num and bd2.num < bd3.num
) triples left join
t
on triples.num1 in (tab.number1, tab.number2, tab.number3, tab.number4, tab.number5) and
triples.num2 in (tab.number1, tab.number2, tab.number3, tab.number4, tab.number5) and
triples.num3 in (tab.number1, tab.number2, tab.number3, tab.number4, tab.number5)
group by triples.num1, triples.num2, triples.num3
order by count(*) desc;