[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Система личных сообщений на сайте
Raymond
Помогите разобраться со структурой таблиц и запросами для реализации сообщений.

Я придумал такой вариант:

Таблица сообщений

id - id сообщения
text - текст
date - дата
writer_id i- d отправителя
reader_id -id получателя
writer_folder - папка , в которой письмо у отправителя (отправленные, полученные, корзина и тд
reader_folder папка , в которой письмо у получателя
reader_deleted - удалено ли у получателя
writer_deleted- удалено ли у отправителя

Теперь, если надо достать все письма пользователя , которые лежат в папке "входящие", делаю запрос:
SELECT * FROM ( SELECT * FROM messages WHERE reader_id = '.$user_id.' AND reader_folder = "Vhodayshie"
UNION
SELECT * FROM messages WHERE writer_id = '.$user_id.' AND writer_folder = "Vhodayshie" )
temp_table ORDER BY `id` DESC

Вывожу все это в виде списка сообщений с чекбоксами . Отмеченные
сообщения можно перемещать в другие папки, удалять и тд.

Чтобы,например, переместить сообщения, нужно сделать два запроса:
1)'UPDATE messages SET writer_folder = "Arhiv" WHERE writer_id = '.$user_id.' AND id IN ('.$message_id_array.')'  //$message_id_list - это перечень id всех отмеченных  чекбоксами сообщений.

2) 'UPDATE messages SET reader_folder = "Arhiv" WHERE reader_id = '.$user_id.' AND id IN ('.$message_id_list.')'

Ну и чтобы удалить, соответственно тоже 2 запроса
1)'UPDATE messages SET writer_deleted = 1 WHERE writer_id = '.$user_id.' AND id IN ('.$message_id_array.')'  //$message_id_list - это перечень id всех отмеченных  чекбоксами сообщений.

2) 'UPDATE messages SET reader_deleted = 1 WHERE reader_id = '.$user_id.' AND id IN ('.$message_id_list.')'

Еще нашел такой вариант:

Таблица сообщений:

id
message
sentby
sentto
created

Таблица папок сообщений

id
user
mailbox
message_id

Чтобы записать сообщение в БД, нужно аж три запроса:
1 для сообщения и два для каждого юзера в таблице папок

Пример таблицы сообщений:

id message sentby sentto created
1 Hi There UserA UserB 2015-01-26
2 Hello Back UserB UserA 2015-01-26

Пример таблицы папок:

id user mailbox message_id
1 UserA Out 1
2 UserB In 1
3 UserB Out 2
4 UserA In 2

This allows you to delete individual rows for the user_mailboxes table. This would also allow for future add-ons by allowing you to send messages to multiple users at the same time (A new row for each user), and allow you to add more than one mailbox if needed (In, Out, Trash, Important, etc).

Чтобы посмотреть все сообщения в какой-нибудь папке, делаем запрос:

SELECT * FROM user_mailboxes LEFT JOIN mbox ON mbox.id = user_mailboxes.message_id WHERE user_mailboxes.user = "$user" AND user_mailboxes.mailbox = "Out";

Подскажите, какой вариант лучше? Какой вы бы выбрали? Может есть еще другие?)

И еще , что быстрее:
SELECT * FROM user_mailboxes LEFT JOIN mbox ON mbox.id = user_mailboxes.message_id WHERE user_mailboxes.user = "$user" AND user_mailboxes.mailbox = "Out";
ИЛИ
SELECT * FROM ( SELECT * FROM messages WHERE reader_id = '.$user_id.' AND reader_folder = "Vhodayshie"
UNION
SELECT * FROM messages WHERE writer_id = '.$user_id.' AND writer_folder = "Vhodayshie" )
temp_table ORDER BY `id` DESC
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.