У меня есть система, в которой пользователь (отправитель) может написать заметку друзьям (получателям), количеству получателей >= 0. Текст сообщения сохраняется в БД и видим отправителю и всем получателям, затем они заходят в систему. В любое время отправитель может добавить больше приемников. Более того, любой из получателей может редактировать сообщение и даже удалять его из БД. Для этой системы я создал 3 таблицы, в скором времени:
пользователи (userID, имя пользователя, пароль)
сообщения (messageID, текст)
list (id, senderID, receiverID, messageID)
в таблице "список" каждая строка соответствует парному отправителю-получателю, например
sender_x_ID - receiver_1_ID - message_1_ID
sender_x_ID - receiver_2_ID - message_1_ID
sender_x_ID - receiver_3_ID - message_1_ID
Теперь проблема заключается в следующем:
1. если пользователь удаляет сообщение из таблицы "сообщения", как автоматически удалять все строки из таблицы "список" , которые соответствуют удаленному сообщению. Нужно ли включать некоторые внешние ключи?
Более важно:
2. если отправитель дал сказать 3 приемника для своего сообщения1 (username1, username2 и username3) и в определенный момент решает добавить username4 и username5 и в то же время исключить username1 из списка получателей. PHP-код получит новый список приемников (username2, username3, username4, username5). Это означает, что вставка в таблицу "list"
sender_x_ID - receiver_4_ID - message_1_ID
sender_x_ID - receiver_5_ID - message_1_ID
а также удалить из таблицы "список" строку, соответствующую user1 (которая больше не находится в списке или получателях)
sender_x_ID - receiver_1_ID - message_1_ID
какой sql-запрос отправить с PHP, чтобы сделать его простым и интеллектуальным способом? Пожалуйста помоги! Примеры sql-запросов были бы идеальными!
Ваша первая проблема проста. Вы можете сделать это, установив внешний ключ на list
. Вы установите его на CASCADE
обновления и удалите (так что DELETE FROM messages WHERE messageID = 5
автоматически удалит все строки в list
, где messageID = 5. Вам нужно будет использовать InnoDB
как механизм хранения для этого, чтобы работать...
Для второй проблемы это тоже легко. Просто вставьте новые строки в один запрос:
INSERT INTO list (senderID, receiverID, messageID)
VALUES (sender_x_id, receiver_4_id, message_1_id),
(sender_x_id, receiver_5_id, message_1_id);
И затем удалите остальные в другом:
DELETE FROM list
WHERE receiverID = receiver_1_id
AND messageID = message_1_id