Mar*_*per 1 mysql sql group-by greatest-n-per-group
以下是我的数据库的样子:
表: conversations
+----+--------+--------+
| id | user_1 | user_2 |
+----+--------+--------+
| 1 | 1 | 2 |
| 2 | 2 | 3 |
| 3 | 1 | 3 |
+----+--------+--------+
Run Code Online (Sandbox Code Playgroud)
表: messages
+----+--------------+------+
| id | conversation | text |
+----+--------------+------+
| 1 | 1 | hej |
| 2 | 1 | test |
| 3 | 2 | doh |
| 4 | 2 | hi |
| 5 | 3 | :) |
| 6 | 3 | :D |
+----+--------------+------+
Run Code Online (Sandbox Code Playgroud)
然后当我运行followin查询时:
SELECT
*
FROM `messages`
INNER JOIN `conversations`
ON `conversations`.`id` = `messages`.`convesations`
GROUP BY `conversations`.`id`
ORDER BY `messages`.`id` DESC
Run Code Online (Sandbox Code Playgroud)
然后我从那里得到了messages:
+----+--------------+------+
| id | conversation | text |
+----+--------------+------+
| 1 | 1 | hej |
| 3 | 2 | doh |
| 5 | 3 | :) |
+----+--------------+------+
Run Code Online (Sandbox Code Playgroud)
但是,是否有可能这样做,我将获得该messages.id组中最高的消息,而不是最低的消息?
编辑:这是我想要的输出messages:
+----+--------------+------+
| id | conversation | text |
+----+--------------+------+
| 2 | 1 | test |
| 4 | 2 | hi |
| 6 | 3 | :D |
+----+--------------+------+
Run Code Online (Sandbox Code Playgroud)
由于这些都是messages相同的conversation最高id.
SELECT *
FROM conversations c
JOIN messages m
ON m.id =
(
SELECT id
FROM messages mi
WHERE mi.conversation = c.id
ORDER BY
mi.conversation DESC, mi.id DESC
LIMIT 1
)
Run Code Online (Sandbox Code Playgroud)
messages (conversation, id)为此创建索引以快速工作.