Выбор SQL различается по max (значению) для нескольких таблиц - PullRequest
0 голосов
/ 11 мая 2018

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

Что мне нужно

  • Одна команда 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 |
+----+-----------------------+------------+---------+

Ожидаемый результат

  1. Для моих сообщений
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

  1. Для моих сообщений

Первый случай в таблице маршрутов для одного конкретного сообщения должен быть смой user_id.Что-то вроде SELECT DISTINCT with the message_id WHERE user_id = my_id

Для полученных сообщений

Последнее вхождение в таблицу маршрутов для одного конкретного сообщения должно быть с моим user_id, а message.arrived должно быть "1".


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

...