以下のように友達を保存するテーブルがあります。
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
)