私は2つのテーブル:User
とUser2Friend
を持っています。私はユーザーの友人を取得する必要があります。クエリではFriendId:FriendId
とUserId
という2つの列を処理する必要があります。なぜ誰が誰を追加したのかわからないからです。結果では両方とも友人です。ユーザーフレンドを取得する、サブクエリー、パフォーマンス
クエリ:
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;
、そのユーザBがユーザAを持っている必要があります後、ユーザーAが友人として、ユーザBを追加した場合、ユーザーBがユーザーに友達リストを表示されます友達リストにも。サブクエリでLIMITを使用することができないため、サブクエリアプローチは本当に好きではありません。
私は数百万人のユーザーを期待しているため、パフォーマンスが重要です。
このクエリを2つの別々のクエリに分割する方が良いと思いますか?
または、私はトリッキーなJOINを持っている必要がありますか?
テーブルの構造を入れてください –
ここにあなたは...^ –