我有两个表: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出现在用户的朋友列表,用户B后,必须有用户A在朋友列表中。我不太喜欢子查询方法,因为我不能在子选择中使用LIMIT。
我期待数百万用户,所以表现很重要。
你认为将这个查询拆分为两个单独的更好吗?
或者我需要有棘手的JOIN?
你可以把你的表的结构 – 2012-04-26 05:46:55
在这里你是...^ – 2012-04-26 05:57:05