Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 获取用户好友、子查询、性能_Mysql_Sql_Performance - Fatal编程技术网

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。