sql-很难构建“复杂”请求

z9smfwbn  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(240)

我有三张table: conversations (包含私人对话) conversations-members -结构: convId | userId (包含参与对话的成员的所有ID,以便多人可以一起交谈。一个用户参与会话等于一行) users (用户表,经典)
我想做的是:
用户有朋友。因此,浏览我的应用程序的用户可以从朋友的ID打开一个对话。
所以,首先,我想看看 conversations-members 如果只有用户的id和他朋友的id之间存在对话,则在中选取对话id conversations 那张table conversations-members 给我的。
一个请求就可以做到吗?如果我要做两个请求,我甚至不知道如何构建第一个( find the rows that contain user's Id and friend's Id that have conversation Id in common) .
我的第一个想法是做一个 conversations 表,它还将以字符串的形式包含成员的id,如“55105,85,22”,然后对其进行解析以获得一个数组,但我认为这样做的方式给了我更多的选择,如果我能够处理所需的sql请求,可能会更简单。

bvn4nwqk

bvn4nwqk1#

不建议使用具有多个值的列。
当关系为1-n时,通常需要使用带有两个键的表,例如convid-userid。您的索引是由这两列创建的,因为不允许生成重复项(例如,同一convid上的用户标识两次)。
但是,回答你的问题,是的,这是可能的搜索。您需要在sql表中搜索两个不同ID位于同一行的条目。你可以使用like子句,但这不是一个好的选择(我认为这是最坏的where子句)。
语法如下:

SELECT convId FROM conversations-members WHERE userId LIKE '%id1%' AND userId LIKE '%id2%'

对于一些额外的建议,如果您的对话总是一对人,请在“对话”表中使用两个新字段。如果您的对话可以有1到n个成员,请使用答案开头建议的“对话成员”。

pb3s4cty

pb3s4cty2#

要找到只涉及两个特定用户的对话,可以这样做。

SELECT convId, COUNT(*)
  FROM `conversations-members`
 WHERE userId IN (FIRST_USER, SECOND_USER)
 GROUP BY convId
HAVING COUNT(*) = 2

这个 HAVING line过滤掉除了你想要的两个用户之外的任何用户的对话。
可以将其用作子查询:

SELECT whatever
  FROM conversations
 WHERE convId IN (
          SELECT convId
            FROM `conversations-members`
           WHERE userId IN (FIRST_USER, SECOND_USER)
           GROUP BY convId
          HAVING COUNT(*) = 2
       )

如果希望与两个用户和任何其他用户进行对话,可以将子查询更改为 HAVING COUNT(*) >= 2 .
专业提示:sql使用连字符 - 平均减法。在列名和表名中避免使用它们。

相关问题