我有三张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请求,可能会更简单。
2条答案
按热度按时间bvn4nwqk1#
不建议使用具有多个值的列。
当关系为1-n时,通常需要使用带有两个键的表,例如convid-userid。您的索引是由这两列创建的,因为不允许生成重复项(例如,同一convid上的用户标识两次)。
但是,回答你的问题,是的,这是可能的搜索。您需要在sql表中搜索两个不同ID位于同一行的条目。你可以使用like子句,但这不是一个好的选择(我认为这是最坏的where子句)。
语法如下:
对于一些额外的建议,如果您的对话总是一对人,请在“对话”表中使用两个新字段。如果您的对话可以有1到n个成员,请使用答案开头建议的“对话成员”。
pb3s4cty2#
要找到只涉及两个特定用户的对话,可以这样做。
这个
HAVING
line过滤掉除了你想要的两个用户之外的任何用户的对话。可以将其用作子查询:
如果希望与两个用户和任何其他用户进行对话,可以将子查询更改为
HAVING COUNT(*) >= 2
.专业提示:sql使用连字符
-
平均减法。在列名和表名中避免使用它们。