と の 2 つのテーブルがUser
ありUser2Friend
ます。ユーザーの友達を取得する必要があります。クエリは FriendId: として 2 つの列を処理する必要が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を使用できないため、サブクエリアプローチはあまり好きではありません。
数百万人のユーザーを想定しているため、パフォーマンスは重要です。
このクエリを 2 つの別々のクエリに分割した方がよいと思いますか?
それとも、トリッキーなJOINが必要ですか?