我有一个存储朋友的表格如下:
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为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因为还有一个其他成员我们都是朋友吗?一旦我在我的模型中运行它,我就确定如果返回的行数超过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
)
答案 0 :(得分:0)
暂时不要把它当成桌子。
为了有资格成为共同的朋友,用户必须在我的圈子和其他用户的圈子中。集合的交集。
所以你有:
SELECT * FROM profiles WHERE id IN (SELECT viewers friends IDs) AND id IN (SELECT the viewed users friends IDS);
写子查询留作练习;)