В общем, плохая затея, надо делать подзапросы.
У юзера может быть много емейлов.
Для проверки занят ли емейл необходмо делать подзапрос, сортировать по email.createAt DESC LIMIT 1 для каждого юзера что создает огромную нагрузку.
Решил добавить поле $isActive, последний емейл который был выставлен будет $isActive = true.
Тогда можно избежать допольнительных подзапросов и делать выборку
join user_emails .... where user_emails.isActive = true.
У юзера может быть активно 2 емейла, один основной и второй бекап, поетому когда проверка на доступность емейла беруться так же и бекап емейлы.
Старые емейлы нужны для логирования. на случай утраты доступа, облегчение восстановления аккаунта.
Хотя это добавила все же некотоырй оверхед, надо обновлять предыдущий емейл.
Если юзер уже исопльзовал емейл, то использовать его заменив $$isActive