mysql - 关于 ORDER BY - MySQL

标签 mysql sql group-by sql-order-by

我正在尝试获取最后一个用户与其他用户的所有聊天记录:

这些是我的表格:

名为“user_data”的表

---------------------------
| id | owner |    name    |
---------------------------  
|  1 |  120  |  "Nicolas" |   
|  2 |  140  |   "Angel"  |
|  3 |  200  |   "Isaac"  |
---------------------------

名为“private_messages”的表

------------------------------------------------------------------------
| id | ownerID | toUserID | chatID | message             | date        |
------------------------------------------------------------------------
|  1 |   120   |   140    |   10   | "Hi"                | 1489777023  |
|  2 |   120   |   140    |   10   | "How are you?"      | 1489777024  |
|  3 |   120   |   140    |   10   | "I miss u"          | 1489777025  |
|  4 |   140   |   120    |   10   | "Viewed."           | 1489777123  |
|  5 |   200   |   120    |   20   | "Hey! What happen?" | 1489777111  |
|  6 |   200   |   120    |   20   | "We were friends."  | 1489777300  |
------------------------------------------------------------------------

我想获取当前登录用户每次聊天的最后一条消息。所以,我做了下一个:首先我得到所有聊天,其中我的 ID 与“ownerID”和“toUserID”相同,然后我将这些数据与“chatID”分组。

我的查询:

SELECT
    _d.chatID, 
    ANY_VALUE( _d.name) AS name,
    ANY_VALUE( _d.message) AS message,
    ANY_VALUE( _d.date) AS date 
FROM (
    SELECT 
        user_data.name,
        private_messages.message,
        private_messages.date,
        private_messages.chatID 
        FROM private_messages 

        INNER JOIN user_data ON private_messages.owner = user_data.owner 

        WHERE private_messages.owner = "120" 
              OR private_messages.touser = "120"

        ORDER BY private_messages.date DESC) AS _d
GROUP BY _d.chatID

问题是这显示了第一条消息而不是最后一条消息,例如,此查询为我提供了下一条数据:

---------------------------------------------------
| name      | message               | date        |
---------------------------------------------------
| "Nicolas" |   "Hi"                | 1489777023  | <-- First message
| "Isaac"   |   "Hey! What happen?" | 1489777111  | <-- First message
---------------------------------------------------

我想要这样的结果:

------------------------------------------------
| name    | message              | date        |
------------------------------------------------
| "Angel" |  "Viewed."           | 1489777123  | <-- Last message
| "Isaac" |  "We were friends."  | 1489777300  | <-- Last message
------------------------------------------------

最佳答案

如果 private_messages.id 是一个 AUTO_INCREMENT PRIMARY KEY 你可以使用这个:

select m.chatID, ud.name, pm.message, pm.date
from (
    select max(id) as id
    from private_messages
    where 120 in (ownerID, touserID)
    group by chatID
) sub
join private_messages pm on pm.id = sub.id
join user_data ud on ud.owner = pm.owner

关于mysql - 关于 ORDER BY - MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42864435/

相关文章:

Python Groupby 排序

mysql - 选择填充字段较多的记录

php - 徽章解锁通知设置

MySQL 如何根据其他列中的值获得摘要列(是/否)

php - 总登录时间

mysql - SQLite 中拉丁语和英语名称的条件排序

java - SQLite JDBC中无需重复列即可实现全外连接效果

python - 使用 pandas GroupBy 检查组中的所有元素是否相等

php - sql操作日期查询查找到日期之间的日期

mysql - 使用MySQL从一行中的两个表中检索数据