[英]Select multiple with Left join
我有一个聊天表,用户可以在其中发布消息,该消息存储在db中,并由预期的收件人读取。
当我发送普通聊天时,没问题,但是当我发送多个或广播时,我会得到库存。
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)
我得到一个空结果
让我们标准化表格:
表用户
id | alias
-----------
1 | mark
2 | joe
表聊天
id | msg | cmd
-----------------------
1 | hi | msg
2 | hello | msg
3 | msg | brc <- broadcast
表聊天
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'
尝试使用此:
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 <-broadcast因此, chat
表中的uid不仅是int,它还可以具有2个或多个整数分开的逗号。 如果我正确理解。
该查询失败的原因是,您正在测试单个列以匹配您自己的列1,2
的串联。 这通常是一个坏主意,因为它不符合规范化关系数据库的范式。 列应具有奇异的原子值。 重新设计“广播”非常容易,这样就不会出现此问题。
我注意到另外两个问题:
这些查询中的每一个都应该给出一个错误,指出存在一个“歧义定义的列”,但是MySQL显然接受了这一点。 无论如何,您都应该在id
添加表格别名,以指定您要表示的表格。
同样,在这种情况下根本不需要使用左联接。 只有在另一个表中可能不存在id的情况下,这才有意义,这应该是不可能的,因为应该由外键约束来保护它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.