繁体   English   中英

通过左联接选择多个

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM