Как объединить результаты запроса MySQL исключив дубликацию результатов?
Общие советы:
Во первых, почитайте как работает DISTINCT - он тут совершенно не при чем.
Во вторых, категорически не рекомендую использовать запрос GROUP BY с указанием в select полей которые не участвуют в группировке / не обработаны агрегирующими функциями. Строго говоря содержимое таких полей может быть достаточно произвольным + на правильно сконфигурированном sql будет ошибка синтаксиса.
Конкретные советы: 
Либо получать вложенным запросом типа select tmp.*, Aincrad\Models\Messages.message
FROM (
  select author, recipient, max(id) as maxid
  from Aincrad\Models\Messages msg
) tmp
join Aincrad\Models\Messages on Aincrad\Models\Messages.id = tmp.maxid что будет весьма медленно, либо создать еще одну таблицу в которой явно хранить именно последнее сообщение диалога.
Не понял почему не должно быть повторов в вашей задаче. Это же не повторы, а элементы перепискии. Что мешает указать ORDER BY id DESC LIMIT 1?