复杂的?MySQL连接选择查询

复杂的?MySQL连接选择查询,mysql,join,chat,Mysql,Join,Chat,我正在尝试获取指定用户id的“联系人”列表。 假设我的用户id为1,我需要从聊天联系人列表中获取联系人的id列表,然后获取每个id的所有信息 所有用户的id、姓名和联系信息 表usr:uid、rname、电话号码 在线状态和其他信息 表聊天usr:uid、昵称、联机状态 包含用户id和该用户拥有的每个联系人的用户id: 表聊天联系人列表:uid,cid(cid=在“uid”用户列表中的人的id 所以我需要指定“uid”的所有“cid”的名称、昵称、联机状态……我不知道我读过关于左连接的教程,但合

我正在尝试获取指定用户id的“联系人”列表。 假设我的用户id为1,我需要从聊天联系人列表中获取联系人的id列表,然后获取每个id的所有信息

所有用户的id、姓名和联系信息

表usr:uid、rname、电话号码

在线状态和其他信息

表聊天usr:uid、昵称、联机状态

包含用户id和该用户拥有的每个联系人的用户id:

表聊天联系人列表:uid,cid(cid=在“uid”用户列表中的人的id

所以我需要指定“uid”的所有“cid”的名称、昵称、联机状态……我不知道我读过关于左连接的教程,但合并多个表很复杂,有人想尝试吗?有什么建议吗

多谢各位

编辑


通过rname更改名称,因为名称是SQL的保留字。

这是一个3表联接,其中您拥有由链接器表
聊天联系人列表定义的多对多关系:

SELECT  ccl.uid, 
        Name            = u.Name,
        Nickname        = cu.nickname,
        OnlineStatus    = cu.onlinestatus
FROM    chat-contactlist ccl
        JOIN chat-usr cu ON ccl.cid = cu.uid
        JOIN usr u       ON u.uid   = cu.uid
Where   ccl.uid = @uid /* your filter here */
SELECT u.name username, c.nickname chat_username, c.online_status
FROM chat-contactlist cc
    JOIN usr u ON (u.uid = cc.uid)
    JOIN chat-usr c ON (c.uid = cc.cid);
这是一个显式联接。如果您希望选择特定用户,则应在后面的
WHERE
子句中添加该联接

SELECT u.name username, c.nickname chat_username, c.online_status
FROM usr u, chat-usr c, chat-contactlist cc
WHERE cc.uid = u.uid
AND cc.cid = c.uid;
这是一种隐式联接,表在
where
语句中通过相等关系关联。不建议使用它,但我发现它们有时更容易阅读

更多信息:


如果某个表中没有数据,您将使用left join,是这样吗?chat usr将始终包含用户的数据,还是不包含用户的数据?请尝试加入。发布sql以获取帮助。chat-usr仅包含联机状态和昵称,usr包含用户的所有信息,并且由于联机状态将经常更新,因此我希望以最快的速度更新e和usr表包含所有用户的所有信息,因此可能会很庞大。Uhoh,在第5行的'-contactlist ccl JOIN chat usr cu on ccl.cid=cu.uid JOIN usr'附近出现一个错误,你能用“`”括起表名吗,例如'chat usr','chat-contactlist'我已经把JOIN
usr
u[…]现在错误是[Err]1052-字段列表中的“uid”列不明确…?!非常好的错误描述,哈哈!你可以通过说ccl.uid来解决它。我更新了答案以反映它!好的,现在它可以工作了,但是它没有得到好的信息,名称为空,在线状态显示为1,在表中我放了0…谢谢链接和答案,但是哈我从开始“near”时发生sql语法错误。我也用rname替换了name,因为name是SQLName中的保留字。您可以使用倒勾(`)来转义保留字,即`name`。