当前位置: 首页 > 知识库问答 >
问题:

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

子车雅珺
2023-03-14

我试图在一个语句中选择用户的聊天列表,以及每个聊天的最新消息和按摩发送者的姓名。

抽象的问题是:任何聊天都可能有多个参与用户。消息发送给“聊天室”,而不是特定用户。

这些是我设计的桌子

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。

共有1个答案

柯凯旋
2023-03-14

此查询:

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的绳索,我试图找出如何进行涉及多对多的特定选择。如果表名太通用,我深表歉意,我只是在做一些自制的练习。我尽力成为一名自学者。 我有3个表,其中一个是链接表。如何编写 “显示哪些用户同时拥有HTC和Samsung手机” (他们拥有2部手机)的语句。我猜答案在WHERE语句中,但我不知道该怎么写。 问题答案: 关键是在GROUP BY / HAVING中使用COUNT个D

  • 我正在尝试将多列添加到phpMyAdmin中的现有表中,但我一直收到相同的错误: #1064-您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册以获取正确的语法... 我在写: 我已经参考了过去在StackOverflow上的帖子,我正在遵循专家的建议,那么为什么我会出错呢?

  • 问题内容: 我有一张调查答案表,类似: 并且我想创建一个查询,该查询将为我提供该表的结果摘要,从而允许我设置相关的日期范围。我下面的声明非常有效: 但是我不确定是否可以做得更好,以及在哪里添加日期范围过滤功能。 问题答案: 来自多刺的诺曼的第一个查询将给出这样的结果: 仅将几组不同的结果分组。我假设您想按问题将是/否的总数分类。在这种情况下,您必须执行以下操作: 结果:

  • 问题内容: 有没有一种方法可以在SQL中同时选择一列和其他列的总和? 例子: 问题答案: 尝试添加GROUP BY

  • 本文向大家介绍用一条mysql语句插入多条数据,包括了用一条mysql语句插入多条数据的使用技巧和注意事项,需要的朋友参考一下        假如有一个数据表A: id name title addtime         如果需要插入n条数据 :    之前我的想法会是,通过数据构造多条插入语句,循环调用 。如:         之后发现了sql的insert语句可以一次插入多条:       

  • 我的问题是,我仍然可以在客户端之间发送消息(客户端到客户端),但发送两三次后,消息不再显示给收件人。 因此,基本上每当客户机希望向另一个客户机发送消息时,该消息首先被发送到服务器。但正如您从我的编码中注意到的,我是以对象的形式发送服务器数据的。例如: 当您发送消息时,类型是“message”。当服务器接收对象时,它检查接收数据及其类型。例如: 如果类型是“message”,那么它会向特定的客户端发

  • 我目前有2个屏幕,一个所有的消息屏幕,其中包括我参与的所有聊天和一个聊天屏幕,这是实际的聊天本身。 在我的聊天屏幕中,我成功地实现了套接字,所以当两个用户同时在聊天屏幕上时,消息就会实时交换。 客户 ChatScreen.js AllMessagessCreen.js

  • 问题内容: 有可能用一个SQL语句,多个表截断吗? 像这样: 问候 问题答案: 不可以,您只能使用TRUNCATE命令截断单个表。要截断多个表,可以使用T-SQL并遍历表名以一次截断每个表名。 您可以在@tableList变量中用逗号分隔所有表名,是的,如果有前缀,则可以截断来自不同模式的多个表。