Получить только последние сообщения из базы данных MySQL - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть таблица, подобная следующей:

|--------|-----------|-------------|-------------|----------------|
| id     | userToId  | userFromId  | message     |   date         |
|--------|-----------|-------------|-------------|----------------|
|  1     |   1       |   2         |  Hi         |06/30/2018/18:00|
|--------|-----------|-------------|-------------|----------------|
|  2     |   1       |   2         |  how r u    |06/30/2018/18:01|
|--------|-----------|-------------|-------------|----------------|
|  3     |   3       |   5         |  Hi         |06/30/2018/17:00|
|--------|-----------|-------------|-------------|----------------|
|  4     |   1       |   5         |  Hi         |06/30/2018/19:00|
|--------|-----------|-------------|-------------|----------------|
|  5     |   7       |   1         |  Hi         |06/30/2018/19:00|
|--------|-----------|-------------|-------------|----------------|

И я хочу получать только последние сообщения (отправленные или полученные), связанные с конкретным пользователем, при условии, что он user ID.Так, например, если user ID равно 1, то результат должен выглядеть следующим образом:

|--------|-----------|-------------|-------------|----------------|
| id     | userToId  | userFromId  | message     |   date         |
|--------|-----------|-------------|-------------|----------------|
|  2     |   1       |   2         |  how r u    |06/30/2018/18:01|
|--------|-----------|-------------|-------------|----------------|
|  4     |   1       |   5         |  Hi         |06/30/2018/19:00|
|--------|-----------|-------------|-------------|----------------|
|  5     |   7       |   1         |  Hi         |06/30/2018/19:00|
|--------|-----------|-------------|-------------|----------------|

Этот вывод означает (для пользователя с id = 1), что последние сообщения получены от других пользователейбыли:

"how r u" -> from user with id = 2
"Hi" -> from user with id = 5

А последние сообщения, отправленные другим пользователям, были:

"Hi" -> to user with id = 7

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

https://www.db -fiddle.com / f / wLEHJ1EgNT9zjecYZEnCcb / 0

SELECT t.*
FROM my_table t
LEFT JOIN my_table temp
ON t.userToId = temp.userToId
   AND t.userFromId = temp.userFromId
   AND t.date < temp.date
WHERE (t.userToId = 1
       OR t.userFromId = 1)
       AND temp.id IS NULL
0 голосов
/ 24 декабря 2018

Во-первых, я предлагаю использовать нормализованные форматы даты (читай Типы дат ) в базе данных и преобразовать ее в запрос, если вы хотите показать в другом формате.Теперь для вашего конкретного случая и формата datetime, который вы используете в таблице, я перейду к следующему запросу:

SELECT
    m.*
FROM
    msgs AS m
INNER JOIN
    ( SELECT
          userToId,
          userFromId,
          MAX(STR_TO_DATE(`date`, '%m/%d/%Y/%H:%i')) AS maxDate
      FROM
          msgs
      GROUP BY
          userToId, userFromId
     ) AS l ON l.userToId = m.userToId
            AND l.userFromId = m.userFromId
            AND l.maxDate = STR_TO_DATE(m.`date`, '%m/%d/%Y/%H:%i')
WHERE
    m.userToId = <your_user_id> OR m.userFromId = <your_user_id>;

Вы можете проверить онлайн-пример с некоторыми данными здесь:

DB-Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...