MYSQL在一个语句中多对多选择(聊天,最新消息,用户名)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL在一个语句中多对多选择(聊天,最新消息,用户名)相关的知识,希望对你有一定的参考价值。

我正在尝试在一条语句中选择用户聊天列表,以及每条聊天的最新消息和消息发件人的姓名。

抽象问题是:曾经的聊天可以有多个参与的用户。消息发送给“聊天”,而不是特定用户。

这些是我想出的表

TABLE users (id, username)
TABLE chats (id)
TABLE messages (id, message, chat_id, user_id)

最后是聊天和参与者之间的多对多关系表

TABLE chats_users (chat_id,user_id)

我想列出某个用户参与的所有聊天,以及最新消息及其发送者的用户名。我将如何在一份声明中处理?

我正在运行mysql 5.0.9和php 7。

答案

此查询:

select max(m.id) id
from chats_users cu
inner join users u on cu.user_id = u.id
inner join messages m on m.chat_id = cu.chat_id
where cu.chat_id in (select chat_id from chats_users where user_id = ?) 
group by cu.chat_id

返回特定用户参与的所有聊天]的最后一条消息。在此查询中使用它:

select m.chat_id, m.message, u.username
from messages m inner join users u
on u.id = m.user_id
where m.id in ( 
  select max(m.id) id
  from chats_users cu
  inner join users u on cu.user_id = u.id
  inner join messages m on m.chat_id = cu.chat_id
  where cu.chat_id in (select chat_id from chats_users where user_id = ?) 
  group by cu.chat_id
) 

以获取这些消息的详细信息。

以上是关于MYSQL在一个语句中多对多选择(聊天,最新消息,用户名)的主要内容,如果未能解决你的问题,请参考以下文章

数据库中多对多关系及其实现

Java中多对多映射关系

Java中多对多映射关系(转)

MySql 学习三(多对多)

Laravel中多对多关系的多重搜索子句

MySQL严格选择涉及多对多表的行