mysql - 从另一个表的数据生成一个表

标签 mysql

我想要做的是我有一个名为消息的表。它有 5 个字段 ID、SENDER、RECIPIENT、MESSAGE 和 TIMESTAMP。每个用户在使用此应用程序时都会获得一个 ID。他使用此应用程序发送的每条消息都会与收件人的 ID 一起存储在该表中。

现在我想要的是能够列出每个对话的最新消息,然后按照最后一条消息的新近度顺序列出每个对话。我们将此表称为“对话”。

两个用户 XX 和 YY 之间的每次对话都定义为由

生成的表
SELECT * FROM MESSAGES WHERE SENDER=XX and RECIPIENT=YY ORDER BY TIMESTAMP

在 CONVERSATIONS 表中,我们只需要 MESSAGES 表中每个对话的最新消息。

我不想使用 PHP,并且正在寻找仅使用 MySQL 的解决方案。谢谢。

最佳答案

如果我理解正确,你可以尝试这样的事情。

select MESSAGES.*,
concat(SENDER|RECIPIENT, "r", SENDER&RECIPIENT) as combo
from MESSAGES inner join (
    select max(TIMESTAMP) maxtime,
    concat(SENDER|RECIPIENT, "r", SENDER&RECIPIENT) as combo2
    from MESSAGES group by combo2
) subq
on combo = combo2 and MESSAGES.TIMESTAMP = subq.maxtime
order by MESSAGES.TIMESTAMP desc

这里使用了标准分组技术( from here ),但我也使用了组合表达式,这是从 (SENDER,RECIPIENT) 到字符串的交换注入(inject)。

它将返回按无序对 {SENDER,RECIPIENT} 分组的具有最大时间戳的所有行

关于mysql - 从另一个表的数据生成一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19465497/

相关文章:

php - 安全地向 Flash 游戏的获胜者提供唯一的密码?

php - 按 JSON 数组对 SQL 数据进行分组

php - 如何在 PHP 中通过 while 循环检索数据

php - Laravel 5.7 中的 mysqli multi_query

MySQL Left Join 返回错误

mysql - 仅当替换值不为空时如何替换到列中?

mysql - YII2 - 在 gridView 中处理 NULL 值 - 显示一列外键,其中一些可能为 NULL

php - 如何在 PHP 中使用下拉列表框更新表中的数据?

php - 使用 for 循环遍历 mysql 结果

mysql - Node 的 require() 如何解析,以便 Express 中的持久数据库池发挥作用?