и не хватает в таблицу заполнить
id - Индификатор сообщения
user_id - Индификатор получателя
user_sender_id - индификатор отправителя
message - сообшения
time - время отправления
Вот и берем свой user_id и групируем sender и выводит 1 последный на время или индификатор. Логика не вижу сложно!
SELECT `mail`.`id_sender`,
MAX(`mail`.`time`) AS `time`,
MIN(`mail`.`is_read`) AS `is_read`,
COUNT(`mail`.`id`) AS `count`
FROM `mail`
WHERE `mail`.`id_user` = ?
GROUP BY `mail`.`id_sender`
ORDER BY `time` DESC