簡體   English   中英

僅從數據庫 mysql 獲取最后一條消息

[英]Get only last messages from database mysql

我有一張像下一張一樣的桌子:

|--------|-----------|-------------|-------------|----------------|
| 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 ID1則輸出應如下所示:

|--------|-----------|-------------|-------------|----------------|
| 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

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

首先,我建議在數據庫上使用規范化的日期格式(讀取Date Types )並在查詢中轉換它,如果你想以另一種格式顯示。 現在,對於您在表上使用的特定情況和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>;

您可以在此處使用一些數據查看在線示例:

數據庫小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM