Чтобы сделать то, что вы хотите, вам, вероятно, потребуются CTE (Common Table Expressions) и LATERAL
запросы. К сожалению, MySQL 5.x не реализует ни один из них.
Следующий запрос находит повторяющиеся имена:
select plain_name, count(*)
from (
select name, trim(replace(lower(name), lower('Dr.'), '')) as plain_name
from my_table
) x
group by plain_name
having count(*) > 1
Это шаг в правильном направлении, но вам нужно будет продолжить процесс, чтобы получить желаемый результат.
Если вы обновитесь до MySQL 8, вы получите CTE, но все равно не получите БОЛЬШИХ запросов.
Редактировать: Я пошел еще дальше, чтобы определить дубликаты имен. Без CTE этот запрос выглядит все более уродливым:
select z.*, y.times
from (
select name, trim(replace(lower(name), lower('Dr.'), '')) as plain_name
from my_table
) z,
(
select plain_name, count(*) as times
from (
select name, trim(replace(lower(name), lower('Dr.'), '')) as plain_name
from my_table
) x
group by plain_name
having count(*) > 1
) y
where z.plain_name = y.plain_name;