0

我有两张桌子:UserUser2Friend。我需要获取用户的朋友。查询应该处理两列作为 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。我不太喜欢子查询方法,因为我不能在子选择中使用 LIMIT。

我预计会有几百万用户,所以性能很重要。

您认为将此查询拆分为两个单独的查询会更好吗?

或者也许我需要棘手的加入?

4

3 回答 3

0
$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'];
        }
}

我不知道我是否理解得很好,但看看这是否能解决问题。

于 2012-04-26T03:44:52.587 回答
0

您在 User2Friend 表中创建第三个字段(Accepted),使用默认值(N),当 A 添加朋友 B 时,它将能够列出该朋友并可以确认(S)并接受友谊。

于 2012-04-26T11:17:45.357 回答
0

好的!我已将其拆分为两个查询...

于 2012-04-27T00:48:01.687 回答