Вы можете получить время последнего разговора между данным пользователем (в моем примере я использую пользователя 1) и любыми другими пользователями, использующими этот запрос:
SELECT CASE WHEN `From` = 1 THEN `To` ELSE `From` END AS other, MAX(Created_at) AS latest
FROM conversations
WHERE `From` = 1 OR `To` = 1
GROUP BY other
Тогда это просто вопрос [ 113], что позволяет получить всю информацию о последнем сообщении между двумя пользователями:
SELECT c.*
FROM conversations c
JOIN (SELECT CASE WHEN `From` = 1 THEN `To` ELSE `From` END AS other, MAX(Created_at) AS latest
FROM conversations
WHERE `From` = 1 OR `To` = 1
GROUP BY other) m
ON (c.From = 1 AND c.To = m.other OR c.To = 1 AND c.From = m.other) AND c.Created_at = m.latest
Вывод:
iD From to Message Read Created_at
3 2 1 blah3 0 2019-01-11 02:17:24
5 1 5 blah5 0 2019-01-11 02:19:24
6 1 3 blah6 0 2019-01-11 02:20:24
Демонстрация на dbfiddle [ 118]
Если бы Вы говорите о C# затем, я разделил бы Ваш DAL, BLL, GUI к различным проектам вместо одного проекта. И имейте одно решение. Это вынудит каждый файл кода быть в одном из проектов.
Я добавил пример:
Если возможный необходимо дать веб-сайт, и winforms проектируют имя относительно приложения.
Этот блог должен предоставить Вам некоторое интересное чтение, несмотря на то, чтобы быть тремя годами. Это могло бы дать Вам идеи помимо тех просто из структуры каталогов.
Единственные файлы, которые я поместил в корневую папку, являются Program.cs и Program.ico (если это - исполняемое приложение).
Я не делаю этого, но это не имеет никакого отношения к структуре каталогов (для меня). Я хочу весь свой код в значимых пространствах имен.
Я всегда помещал базовый класс для своих исключений проектов в корне.