Сообщения между пользователями

Рейтинг: 0Ответов: 1Опубликовано: 07.01.2015

Помогите организовать систему сообщений между пользователями. Сделал две таблицы dialogs и messages. На скринах таблицы dialogs и messages.

Можно ли как-то при выводе всех диалогов взять последнее сообщение из messages для соответствующего диалога и подставить данные к нужному диалогу при выводе всех диалогов. То есть выглядеть будет примерно как в VK. Сам пробовал и так и сяк, но все без толку. Это нужно, чтобы не создавать поля в dialogs text (текст последнего сообщения), date (дата посл. сообщения), которые потом еще и обновлять придется при добавлении сообщений в диалог.

alt text

alt text

Ответы

▲ 1

Я бы сделал так:

SELECT * FROM dialogs
INNER JOIN (
    SELECT dialog_id, MAX(message_id) AS max_message_id FROM message GROUP BY dialog_id
) max_messages ON dialogs.dialog_id = max_messages.dialog_id
INNER JOIN message ON message.message_id = max_messages.max_message_id

Не проверял. Но надеюсь, что ничего не попутал.

UPD:

WHERE и нужно всего один раз писать. А насчет моделей - да. Одна модель User - это один пользователь и соответственно одна запись в таблице. А эта таблица в свою очередь может представлять собой только одного пользователя с его именем, фамилией, логином. Объясню, по-другому. Это еще нужно, чтобы на диаграммах базы данных правильно озаглавливать связи: user отправляет [много] message, dialog включает в себя [много] message и т.д. В этом случае, чтобы различать, что сообщений у пользователей может быть много или всего одно, применяют типы связей: один ко многим, один к одному.

UPD2:

@varz62, мне в универе рассказывали про IDEF1X. Только что нашел отрывок из описания этого стандарта в оригинале. Цитата:

The entity name is a noun phrase that describes the set of things the entity represents. The noun phrase is in singular form, not plural. Abbreviations and acronyms are permitted, however, the entity name must be meaningful and consistent throughout the model... Although an entity may be drawn in any number of diagrams, it only appears once within a given diagram.

http://www.idef.com/pdf/Idef1x.pdf, страница 8

Плюс ко всему, мне кажется удобным, когда название модели и таблицы совпадают. Зачем плодить неразбериху?