Mysql 获取用户好友、子查询、性能
我有两个表:Mysql 获取用户好友、子查询、性能,mysql,sql,performance,Mysql,Sql,Performance,我有两个表:User和User2Friend。我需要得到用户的朋友。查询应将两列作为FriendId处理:FriendId和UserId,因为我们不知道谁添加了谁。结果他们都是朋友 查询: SELECT DISTINCT `Id` , `UserName` FROM `User` WHERE `Id` IN (SELECT IF(`UserId` = 25, `FriendId`, `UserId`) -- This important part - fr
User
和User2Friend
。我需要得到用户的朋友。查询应将两列作为FriendId处理:FriendId
和UserId
,因为我们不知道谁添加了谁。结果他们都是朋友
查询:
SELECT DISTINCT
`Id`
, `UserName`
FROM `User`
WHERE `Id` IN
(SELECT
IF(`UserId` = 25, `FriendId`, `UserId`) -- This important part - friends are always mutual
FROM `User2Friend`
WHERE `UserId` = 25
OR `FriendId` = 25)
LIMIT 10
模式:
CREATE TABLE `User` (
`Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`UserName` varchar(16) DEFAULT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `User2Friend` (
`Id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`UserId` int(10) unsigned NOT NULL,
`FriendId` int(10) unsigned NOT NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `UserIdFriendId` (`UserId`, `FriendId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
如果用户A将用户B添加为好友,则用户B将出现在用户A好友列表中,之后用户B也必须将用户A包含在好友列表中。我真的不喜欢子查询方法,因为我不能在子选择中使用限制
我预计会有数百万用户,所以性能很重要
您认为将此查询拆分为两个单独的查询会更好吗
或者我需要一个棘手的加入
$sql1 = ("SELECT Id, UserName FROM User WHERE UserId = 25");
foreach($sql1 as $row){
$id = $row['Id'];
$name = $row['UserName'];
$sql2 = ("SELECT * FROM User2Friend WHERE FriendId = $id LIMIT 10");
foreach($sql2 as $row){
$FriendId = $row['FriendId'];
$FriendName = $row['FriendName'];
}
}
我不知道我是否理解得很好,但看看这是否解决了问题。在User2Friend表中创建第三个字段(已接受),使用默认值(N),当添加朋友B时,它将能够列出这些朋友,并可以确认和接受友谊。好的!我已将其拆分为两个查询…1。您的示例是错误的,因为您为ID25选择了第一个,而不是所有的朋友Id。2.实际上,您必须考虑查找表中的两列:FriendId和UserId。根据谁添加了谁…您可以将表的结构放入不需要添加的字段中,如
User2Friend
table has accepted friends。