У меня проблема с частью моего собственного приложения.Упрощенно, это своего рода служба сообщений, где кто-то может отправить сообщение в пул, а другой может получить непрочитанное сообщение в пуле.Важно отметить, что если кто-то получит сообщение, он получит предварительный просмотр.Если он решит не сохранять это сообщение, он может вернуть его в пул доступных сообщений.
Что мне нужно
- Одна команда sql для вывода списка всех моих отправленных сообщений (paramater: logintoken) с содержимым, меткой времени и именем пользователя получателя (если есть)any)
- Одна команда sql для вывода списка всех полученных сообщений (paramater: logintoken) с именем пользователя отправителя, message, creation_date и receive_date
Как выглядит схема базы данных
Таблица «сообщение»: id: int, прибыл: бит, содержимое: varchar, creation_timestamp: String (дд-мм-гг чч: мм: сс), открыто: бит
- Received устанавливается в значение true, когда кто-то получил сообщение (небольшой обзор).
- Открытое значение устанавливается в значение true, когда кто-либо читает сообщение целиком.
Таблица «route»: id: int, отметка времени (см. выше), id_message, id_user
- маршрут создается каждый раз, когда пользователь создает сообщение
- id_user может быть создателем или получателем
- они не обновляются
Таблица "сеанс": токен: varchar,user_id: int
Таблица "user": id: int, имя пользователя: varchar, [...]
Пример данных
SELECT id, username FROM user
+----+----------+
| id | username |
+----+-----------+
| 32 | userx |
| 33 | usery |
| 34 | userz |
| 35 | usertest |
| 36 | usertest2 |
| 37 | usertest3 |
| 38 | usertest4 |
+----+-----------+
SELECT * FROM session
+--------------------------------------+---------------+---------+
| token | creationTime | user_id |
+--------------------------------------+---------------+---------+
| 35107851-3ae6-40c7-8b4a-662a407ff2dc | 1526046557203 | 32 |
| 426c752a-7ad9-4bf0-b8db-1489904af495 | 1526046557267 | 36 |
| 42de6f78-6257-4014-a349-53702cb3adc0 | 1526046557277 | 37 |
| 7a3d46ed-9113-4030-8bcf-906cf2e361a7 | 1526046557346 | 38 |
| c8e7921e-fb5a-4a6e-9cd6-4a7d24e30129 | 1526046557226 | 35 |
+--------------------------------------+---------------+---------+
SELECT * FROM messages
+----+---------+-------------------------------+-----------------------+--------+
| id | arrived | content | timestamp | opened |
+----+---------+-------------------------------+-----------------------+--------+
| 2 | 0 | "This is a testmessage. Nr1" | "11-05-2018 15:49:14" | 0 |
| 3 | 0 | "This is a testmessage. Nr2" | "11-05-2018 15:49:14" | 0 |
| 4 | 0 | "This is a testmessage. Nr3" | "11-05-2018 15:49:14" | 0 |
| 5 | 0 | "This is a testmessage. Nr4" | "11-05-2018 15:49:14" | 0 |
| 6 | 0 | "This is a testmessage. Nr5" | "11-05-2018 15:49:14" | 0 |
| 7 | 0 | "This is a testmessage. Nr6" | "11-05-2018 15:49:14" | 0 |
| 8 | 0 | "This is a testmessage. Nr7" | "11-05-2018 15:49:14" | 0 |
| 9 | 0 | "This is a testmessage. Nr8" | "11-05-2018 15:49:14" | 0 |
| 10 | 0 | "This is a testmessage. Nr9" | "11-05-2018 15:49:14" | 0 |
| 11 | 0 | "This is a testmessage. Nr10" | "11-05-2018 15:49:14" | 0 |
| 12 | 1 | "This is a testmessage. Nr11" | "11-05-2018 15:49:14" | 0 |
| 13 | 1 | "This is a testmessage. Nr12" | "11-05-2018 15:49:14" | 0 |
| 14 | 1 | "This is a testmessage. Nr13" | "11-05-2018 15:49:14" | 0 |
| 15 | 1 | "This is a testmessage. Nr14" | "11-05-2018 15:49:14" | 0 |
| 16 | 1 | "This is a testmessage. Nr15" | "11-05-2018 15:49:14" | 0 |
| 17 | 1 | "This is a testmessage. Nr16" | "11-05-2018 15:49:14" | 0 |
| 18 | 1 | "This is a testmessage. Nr17" | "11-05-2018 15:49:14" | 0 |
| 19 | 1 | "This is a testmessage. Nr18" | "11-05-2018 15:49:14" | 0 |
| 20 | 0 | "This is a testmessage. Nr19" | "11-05-2018 15:49:14" | 0 |
| 21 | 0 | "This is a testmessage. Nr20" | "11-05-2018 15:49:14" | 0 |
| 22 | 0 | "This is a testmessage. Nr21" | "11-05-2018 15:49:14" | 0 |
| 23 | 0 | "This is a testmessage. Nr22" | "11-05-2018 15:49:14" | 0 |
| 24 | 0 | "This is a testmessage. Nr23" | "11-05-2018 15:49:14" | 0 |
| 25 | 0 | "This is a testmessage. Nr24" | "11-05-2018 15:49:14" | 0 |
| 26 | 0 | "This is a testmessage. Nr25" | "11-05-2018 15:49:14" | 0 |
| 27 | 0 | "This is a testmessage. Nr26" | "11-05-2018 15:49:14" | 0 |
| 28 | 0 | "This is a testmessage. Nr27" | "11-05-2018 15:49:14" | 0 |
| 29 | 0 | "This is a testmessage. Nr28" | "11-05-2018 15:49:14" | 0 |
| 30 | 0 | "This is a testmessage. Nr29" | "11-05-2018 15:49:14" | 0 |
| 31 | 0 | "This is a testmessage. Nr30" | "11-05-2018 15:49:14" | 0 |
+----+---------+-------------------------------+-----------------------+--------+
SELECT * from route
+----+-----------------------+------------+---------+
| id | timestamp | id_message | id_user |
+----+-----------------------+------------+---------+
| 39 | "11-05-2018 15:49:17" | 1 | 33 |
| 40 | "11-05-2018 15:49:17" | 2 | 35 |
| 41 | "11-05-2018 15:49:17" | 3 | 35 |
| 42 | "11-05-2018 15:49:17" | 4 | 35 |
| 43 | "11-05-2018 15:49:17" | 5 | 35 |
| 44 | "11-05-2018 15:49:17" | 6 | 35 |
| 45 | "11-05-2018 15:49:17" | 7 | 35 |
| 46 | "11-05-2018 15:49:17" | 8 | 35 |
| 47 | "11-05-2018 15:49:17" | 9 | 35 |
| 48 | "11-05-2018 15:49:17" | 10 | 35 |
| 49 | "11-05-2018 15:49:17" | 11 | 35 |
| 50 | "11-05-2018 15:49:17" | 12 | 36 |
| 51 | "11-05-2018 15:49:17" | 13 | 36 |
| 52 | "11-05-2018 15:49:17" | 14 | 36 |
| 53 | "11-05-2018 15:49:18" | 15 | 36 |
| 54 | "11-05-2018 15:49:18" | 16 | 36 |
| 55 | "11-05-2018 15:49:18" | 17 | 36 |
| 56 | "11-05-2018 15:49:18" | 18 | 36 |
| 57 | "11-05-2018 15:49:18" | 19 | 36 |
| 58 | "11-05-2018 15:49:18" | 20 | 36 |
| 59 | "11-05-2018 15:49:18" | 21 | 36 |
| 60 | "11-05-2018 15:49:18" | 22 | 37 |
| 61 | "11-05-2018 15:49:18" | 23 | 37 |
| 62 | "11-05-2018 15:49:18" | 24 | 37 |
| 63 | "11-05-2018 15:49:18" | 25 | 37 |
| 64 | "11-05-2018 15:49:18" | 26 | 37 |
| 65 | "11-05-2018 15:49:18" | 27 | 37 |
| 66 | "11-05-2018 15:49:18" | 28 | 37 |
| 67 | "11-05-2018 15:49:18" | 29 | 37 |
| 68 | "11-05-2018 15:49:18" | 30 | 37 |
| 69 | "11-05-2018 15:49:18" | 31 | 37 |
| 70 | "11-05-2018 15:49:18" | 12 | 35 |
| 71 | "11-05-2018 15:49:18" | 13 | 35 |
| 72 | "11-05-2018 15:49:18" | 14 | 35 |
| 73 | "11-05-2018 15:49:18" | 15 | 35 |
| 74 | "11-05-2018 15:49:18" | 16 | 35 |
| 75 | "11-05-2018 15:49:18" | 17 | 35 |
| 76 | "11-05-2018 15:49:18" | 18 | 35 |
| 77 | "11-05-2018 15:49:18" | 19 | 35 |
+----+-----------------------+------------+---------+
Ожидаемый результат
- Для моих сообщений
SELECT ... WHERE token = (in this case: 42de6f78-6257-4014-a349-53702cb3adc0)
+------------+-------------------+-------------------------------+-----------------------+-----------------------+
| id_message | receiver_username | message_content | creation_date | last_forward_date |
+------------+-------------------+-------------------------------+-----------------------+-----------------------+
| 60 | NULL | "This is a testmessage. Nr21" | "11-05-2018 15:49:14" | "11-05-2018 15:49:18" |
| 61 | NULL | "This is a testmessage. Nr22" | "11-05-2018 15:49:14" | 11-05-2018 15:49:18 |
| 62 | NULL | [...] | [...] | [...] |
| 63 | NULL | [...] | [...] | [...] |
| 64 | NULL | [...] | [...] | [...] |
| 65 | NULL | [...] | [...] | [...] |
| 66 | NULL | [...] | [...] | [...] |
| 67 | NULL | [...] | [...] | [...] |
| 68 | NULL | [...] | [...] | [...] |
| 69 | NULL | [...] | [...] | [...] |
+------------+-------------------+-------------------------------+-----------------------+-----------------------+
Для полученных сообщений
SELECT ... WHERE token = (in this case: c8e7921e-fb5a-4a6e-9cd6-4a7d24e30129) AND message.arrived = 1 AND ...
+------------+-----------------+------------------------------+---------------------+---------------------+
| id_message | sender_username | message_content | creation_date | last_forward_date |
+------------+-----------------+------------------------------+---------------------+---------------------+
| 12 | usertest2 | This is a testmessage. Nr.11 | 11-05-2018 15:49:14 | 11-05-2018 15:49:18 |
| 13 | usertest2 | This is a testmessage. Nr.12 | [...] | [...] | [...] |
| 14 | usertest2 | [...] | [...] | [...] |
| 15 | usertest2 | [...] | [...] | [...] |
| 16 | usertest2 | [...] | [...] | [...] |
| 17 | usertest2 | [...] | [...] | [...] |
| 18 | usertest2 | [...] | [...] | [...] |
| 19 | usertest2 | [...] | [...] | [...] |
+------------+-----------------+------------------------------+---------------------+---------------------+
Подсказки
Я подумал о возможности использования SELECT DISTINCT при использовании JOINS для нескольких таблиц.В предложении where должно быть что-то вроде `WHERE token = XYZZZZ
- Для моих сообщений
Первый случай в таблице маршрутов для одного конкретного сообщения должен быть смой user_id.Что-то вроде SELECT DISTINCT with the message_id WHERE user_id = my_id
Для полученных сообщений
Последнее вхождение в таблицу маршрутов для одного конкретного сообщения должно быть с моим user_id, а message.arrived должно быть "1".
Пока ничего не получалось, потому что мне не хватает идеи, как это реализовать.Есть ли у кого-нибудь еще идеи или уловки, которые я могу использовать для реализации этого?Заранее спасибо за любую помощь!