0

と の 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が必要ですか?

4

3 に答える 3

0
$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'];
        }
}

よく理解できたかどうかわかりませんが、これで問題が解決するかどうかを確認してください。

于 2012-04-26T03:44:52.587 に答える
0

User2Friend テーブルに 3 番目のフィールド (Accepted) をデフォルト値 (N) で作成すると、A が友人 B を追加すると、この友人を一覧表示し、確認 (S) して友情を受け入れることができます。

于 2012-04-26T11:17:45.357 に答える
0

わかった!私はそれを2つのクエリに分割しました...

于 2012-04-27T00:48:01.687 に答える