我有一个聊天表,用户可以在其中发布消息,并将其存储在数据库中并由目标收件人读取。
当我发送正常聊天时,没问题,但是当我发送多个或广播时,我会得到股票。
table users
id | alias
-----------
1 | mark
2 | joe
表聊天
id | uid | msg | cmd
-----------------------
1 | 1 | hi | msg
2 | 2 | hello | msg
3 | 1,2 | msg | brc <- broadcast
用于阅读正常的一对一消息
Select u.alias, c.id cid from chat c left join user u on u.id=c.uid
where c.uid= 1
现在对于广播,对于id为1的用户,我尝试了这个
Select u.alias, c.id cid from chat c left join user u on u.id=c.uid
where id in IN (1,2)
为另一个ID为2的用户
Select u.alias, c.id cid from chat c left join user u on u.id=c.uid
where id in IN (1,2)
我得到一个空结果
答案 0 :(得分:2)
让我们对表格进行规范化:
表用户
id | alias
-----------
1 | mark
2 | joe
表聊天
id | msg | cmd
-----------------------
1 | hi | msg
2 | hello | msg
3 | msg | brc <- broadcast
表格chatrouting
id | userid| msgid
-----------------------
1 | 1 | 1
2 | 2 | 2
3 | 1 | 3
4 | 2 | 3
然后您可以通过以下方式获取所有标记的消息:
SELECT c.msg
FROM chat c
LEFT JOIN chatrouting cr ON cr.msgid = c.id
LEFT JOIN user u ON u.id = cr.userid
WHERE u.alias = 'mark'
答案 1 :(得分:0)
尝试使用它:
Select u.alias, c.id cid from chat c
left join user u on FIND_IN_SET(u.id,'1,2')
where id in IN (1,2)
因为行看起来像
3 | 1,2 |消息| brc&lt; - 广播
所以在chat
表中的uid不仅仅是int,它可以有2个或更多整数分隔逗号。如果我理解的话。
答案 2 :(得分:0)
此查询失败的原因是您正在测试单个列以匹配您自己的列1,2
的串联。这通常是一个坏主意,因为它不符合规范化关系数据库的范例。列应该具有单一的原子值。很容易重新设计你的广播&#39;所以你没有遇到这个问题。
我注意到的其他两个问题:
这些查询中的每一个都应该给出一个错误,指出存在一个&#34;不明确定义的列&#34;,但显然MySQL接受了这个。在任何情况下,您都应该在id
中添加一个表别名,以指定您的意思。
此外,在这种情况下根本不需要使用左连接。这只有在其他表中不存在id的情况下才有意义,这是不可能的,因为它应该受到外键约束的保护。