【问题标题】:Getting user friends, Subquery, Performance获取用户好友、子查询、性能
【发布时间】:2012-04-27 08:48:01
【问题描述】:

我有两张桌子:UserUser2Friend。我需要获取用户的朋友。查询应该处理两列作为 FriendId:FriendIdUserId,因为我们不知道谁添加了谁。结果两人都是朋友。

查询:

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。

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

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

或者我可能需要棘手的 JOIN?

【问题讨论】:

  • 能不能把你的表结构放一下

标签: mysql sql performance


【解决方案1】:
$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'];
        }
}

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

【讨论】:

  • 1.您的示例是错误的,因为您首先选择 ID 25 而不是所有朋友 ID。 2. 实际上,您必须考虑查找表中的两列:FriendId 和 UserId。取决于谁添加了谁...
【解决方案2】:

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

【讨论】:

  • 不需要添加User2Friend表已接受好友等字段。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2015-06-02
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    相关资源
    最近更新 更多