Возможно, самый простой метод:
select concat(substring_index(ticket, '-', 1), , '-',
min(substring_index(ticket, '-', -1) + 0)
) as first_ticket
from t
group by substring_index(ticket, '-', 1)
Восстанавливает значение после взятия min()
в качестве числа.
Если вы не хотите восстанавливать значение:
select (select t.ticket
from tickets t
where t.ticket like concat(p.project, '-%')
order by length(ticket), ticket
limit 1
) as first_ticket
from projects p;
При этом используются только строковые операции для минимального значения, поэтому предполагается, что заполнение нулями отсутствует. Также можно изменить, чтобы использовать числа:
order by p.project, substring_index(ticket, '-', -1) + 0