我有两张桌子: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。我不太喜欢子查询方法,因为我不能在子选择中使用 LIMIT。
我预计会有几百万用户,所以性能很重要。
您认为将此查询拆分为两个单独的查询会更好吗?
或者也许我需要棘手的加入?