使用左连接选择多个

时间:2014-04-16 22:37:13

标签: mysql sql

我有一个聊天表,用户可以在其中发布消息,并将其存储在数据库中并由目标收件人读取。

当我发送正常聊天时,没问题,但是当我发送多个或广播时,我会得到股票。

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)

我得到一个空结果

3 个答案:

答案 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的情况下才有意义,这是不可能的,因为它应该受到外键约束的保护。