所以我有一个类似这样的设置数据库(简化,就表而言,都是InnoDB):
Users: contains based user authentication information (uid, username, encrypted password, et cetera)
Contacts: contains two rows per relationship that exists between users as
(uid1, uid2), (uid2, uid1) to allow for a good 1:1 relationship
(must be mutual) between users
Messages: has messages that consist of a blob, owner-id, message-id (auto_increment)
所以我的问题是,获取属于特定用户所有联系人的所有消息的最佳MySQL查询是什么?有没有一种有效的方法呢?
答案 0 :(得分:1)
select m.owner-id, m.blob
from Users u
join Contacts c on u.uid = c.uid1
join Messages m on m.owner-id = c.uid2
where u.username = 'the_username';
现在的问题是,这将返回所有联系人拥有的每条消息,无论消息是否与uid1和uid2之间的某些交互相关联。
此外,如果您想查看消息旁边的联系人姓名而不是uid:
select u2.username, m.blob
from Users u
join Contacts c on u.uid = c.uid1
join Messages m on m.owner-id = c.uid2
join Users u2 on u2.uid = c.uid2
where u.username = 'the_username';
在重新阅读你的问题之后,我注意到“必须是共同的事情”。听起来你还需要一个存在的查询来检查该部分,以便将结果限制为仅相互关系。
如果提供了样本表定义,可能更容易编写。