Что я понимаю из вашего вопроса, вам нужно отобразить 3 последние версии "ab", но со всеми их подрывными действиями. Вот код, который будет работать:
select ver from app inner join
(select CONCAT(LPAD(SUBSTRING_INDEX(ver, '.', 1), 50, '0'),
LPAD(SUBSTRING(ver, LOCATE('.', ver)+1, LOCATE('.', ver, LOCATE('.', ver)+1)), 50, '0')) as ver2
from app group by ver2 order by ver2 desc limit 3) as v2
on CONCAT(LPAD(SUBSTRING_INDEX(ver, '.', 1), 50, '0'),
LPAD(SUBSTRING(ver, LOCATE('.', ver)+1, LOCATE('.', ver, LOCATE('.', ver)+1)), 50, '0')) = v2.ver2
order by v2.ver2 desc
Внутренний запрос выделяет три верхние версии формы 'a.0000b', а внутреннее объединение сопоставляет все версии с 'ab' = 'c .d '