对话sql结构(群聊)

ygya80vv  于 2022-11-14  发布在  Java
关注(0)|答案(1)|浏览(365)

在过去的一周里,我在做了大量的搜索,并试图找到更好的答案之后,一直在努力找到一个对话聊天的最佳结构。我目前的结构是这样的:



必须能够:
一个小组最多有(n)名参与者(假设n=5)
检查参与者之间是否已经存在对话(这一直困扰着我……)
显示最新的对话,按未读和最后一条消息的时间戳排序(应该有效)
显示最新的对话(按未读和时间戳排序)

  1. SELECT * FROM chat_participants WHERE pageId = ? AND isMuted=0 ORDER BY isRead DESC, lastmod DESC

检查参与者之间是否已经存在对话
客户端用户将能够向特定的最终用户发送一条新消息,或者与最多5名参与者开始一次新的群聊。我不想每次都开始一个新的对话,而是想检查对话是否已经存在,将消息附加到那里。我希望这有道理。当我试图想出一个好的结构时,这个特性一直困扰着我。有没有人有办法用这种结构“和平地”解决这个问题,或者你有更好的办法?谢谢:)
我尝试了一些方法,比如检查页面id是否存在于具有相同聊天id的聊天室参与者中,但这也带来了自身的缺点。这是我尝试过的,但显然没有按预期工作,因为它返回(x)个记录,这可能是完全不同的chatid值。

  1. SELECT * FROM chat_participants WHERE pageId IN(<id1>,<id2>)

我很感激你在这方面的意见。祝你有美好的一天!:)
编辑(回答@gordon linoff)收件人表示例:

我用了你的代码如下:(这个有效)

  1. SELECT cp.chatId FROM chatParticipants cp GROUP BY cp.chatId HAVING GROUP_CONCAT(pageId ORDER BY pageId) IN('p1,p2')

但当我试图检查另一个对话,与其他收件人,如下面,它没有。

  1. SELECT cp.chatId FROM chatParticipants cp GROUP BY cp.chatId HAVING GROUP_CONCAT(pageId ORDER BY pageId) IN('deb47fba9bc6936ed76e831578baa480,123')

另外,为什么只有当值被 Package 在相同的引号中时它才起作用?e、 g如果使用,则不返回任何内容 IN ('p1', 'p2') 编辑2
所以我结合了一些建议的答案,提出了这个问题。

  1. SELECT chatId FROM chatParticipants GROUP BY chatId HAVING SUM(pageId NOT IN('deb47fba9bc6936ed76e831578baa480','123')) = 0

到目前为止,我在上面的查询中发现的唯一问题是,类似下面的查询仍然返回chatid值(即使(144)在聊天室中不存在)

  1. SELECT chatId FROM chatParticipants GROUP BY chatId HAVING SUM(pageId NOT IN('deb47fba9bc6936ed76e831578baa480','144','123')) = 0

有什么办法解决这个问题吗?

7fyelxc5

7fyelxc51#

如果你想知道 chatId 对于特定的参与者组,则一种方法是聚合。例如,要查找恰好有1、2和3参与的聊天:

  1. select cp.chatid
  2. from chat_participants cp
  3. group by cp.chatid
  4. having group_concat(pageid order by pageid)= '1,2,3';

相关问题