在过去的一周里,我在做了大量的搜索,并试图找到更好的答案之后,一直在努力找到一个对话聊天的最佳结构。我目前的结构是这样的:
必须能够:
一个小组最多有(n)名参与者(假设n=5)
检查参与者之间是否已经存在对话(这一直困扰着我……)
显示最新的对话,按未读和最后一条消息的时间戳排序(应该有效)
显示最新的对话(按未读和时间戳排序)
SELECT * FROM chat_participants WHERE pageId = ? AND isMuted=0 ORDER BY isRead DESC, lastmod DESC
检查参与者之间是否已经存在对话
客户端用户将能够向特定的最终用户发送一条新消息,或者与最多5名参与者开始一次新的群聊。我不想每次都开始一个新的对话,而是想检查对话是否已经存在,将消息附加到那里。我希望这有道理。当我试图想出一个好的结构时,这个特性一直困扰着我。有没有人有办法用这种结构“和平地”解决这个问题,或者你有更好的办法?谢谢:)
我尝试了一些方法,比如检查页面id是否存在于具有相同聊天id的聊天室参与者中,但这也带来了自身的缺点。这是我尝试过的,但显然没有按预期工作,因为它返回(x)个记录,这可能是完全不同的chatid值。
SELECT * FROM chat_participants WHERE pageId IN(<id1>,<id2>)
我很感激你在这方面的意见。祝你有美好的一天!:)
编辑(回答@gordon linoff)收件人表示例:
我用了你的代码如下:(这个有效)
SELECT cp.chatId FROM chatParticipants cp GROUP BY cp.chatId HAVING GROUP_CONCAT(pageId ORDER BY pageId) IN('p1,p2')
但当我试图检查另一个对话,与其他收件人,如下面,它没有。
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
所以我结合了一些建议的答案,提出了这个问题。
SELECT chatId FROM chatParticipants GROUP BY chatId HAVING SUM(pageId NOT IN('deb47fba9bc6936ed76e831578baa480','123')) = 0
到目前为止,我在上面的查询中发现的唯一问题是,类似下面的查询仍然返回chatid值(即使(144)在聊天室中不存在)
SELECT chatId FROM chatParticipants GROUP BY chatId HAVING SUM(pageId NOT IN('deb47fba9bc6936ed76e831578baa480','144','123')) = 0
有什么办法解决这个问题吗?
1条答案
按热度按时间7fyelxc51#
如果你想知道
chatId
对于特定的参与者组,则一种方法是聚合。例如,要查找恰好有1、2和3参与的聊天: