-1

以下のように友達を保存するテーブルがあります。

CREATE TABLE `friends` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `to_id` int(11) NOT NULL,
  `from_id` int(11) NOT NULL,
  `status` char(10) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `status` (`status`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;

INSERT INTO `friends` (`id`, `to_id`, `from_id`, `status`, `created_at`, `updated_at`) VALUES
(1, 2, 3, 'pending', '2013-08-10 00:00:00', '2013-08-10 00:00:00'),
(2, 1, 3, 'approved', '2013-08-11 00:00:00', '2013-08-11 00:00:00'),
(3, 2, 1, 'approved', '2013-08-15 20:51:20', '2013-08-15 20:51:20'); 

メンバー (視聴者と呼びます) が別のメンバー (彼らが閲覧しているプロフィール) の友達の友達であるかどうかを判断できるようにしたいと考えています。視聴者がプロフィールを表示できるかどうかを判断するには、この情報が必要です。私 (id of 2) が id 3 のプロファイルを表示しているとします。以下のクエリは、これまでのクエリです。

SELECT COUNT(*) FROM profiles 
LEFT JOIN friends ON (profiles.id = friends.to_id OR profiles.id = friends.from_id) 
WHERE (friends.to_id = 2) OR (friends.from_id = 2)
AND profiles.id IN (
    SELECT profiles.id 
    FROM profiles 
    LEFT JOIN friends ON (profiles.id = friends.to_id OR profiles.id = friends.from_id)
    WHERE (friends.to_id = 3) OR (friends.from_id = 3)
    GROUP BY profiles.id
)
AND friends.status = 'approved';

これを PHPMyAdmin で実行すると 4 が得られますが、お互いに友達であるメンバーが他に 1 人いるため、1 を得る必要はありませんか? これを自分のモデルで実行すると、返される行が 0 行を超える場合は、プロファイルを表示しても問題ないことを確認します。適切に実行されるように、これを微調整するのを手伝ってくれる人はいますか? 私はこの時点でちょっと迷っています。前もって感謝します。

私はそれを理解することができました。これが以下の作業クエリです。

SELECT COUNT(*) AS count 
                FROM profiles 
                WHERE profiles.id IN (
                    SELECT profiles.id 
                    FROM profiles
                    LEFT JOIN friends ON (friends.to_id = profiles.id OR friends.from_id = profiles.id)
                    WHERE (friends.to_id = 1 OR friends.from_id = 1)
                    AND profiles.id != 1
                )
                AND profiles.id IN (
                    SELECT profiles.id 
                    FROM profiles 
                    LEFT JOIN friends ON (friends.to_id = profiles.id OR friends.from_id = profiles.id)
                    WHERE (friends.to_id = 3 OR friends.from_id = 3)
                    AND profiles.id != 3
                )
4

1 に答える 1

0

ちょっとの間、それをテーブルとは考えないでください。

共通の友達になるには、ユーザーが自分のサークルと他のユーザーのサークルに参加している必要があります。セットの交差。

だからあなたは持っています:

SELECT * FROM profiles WHERE id IN (SELECT viewers friends IDs) AND id IN (SELECT the viewed users friends IDS);

サブクエリの記述は演習として残します ;)

于 2013-08-21T00:53:39.790 に答える