MySQL查询以确定成员是否是其他成员的朋友的朋友

时间:2013-08-13 01:44:46

标签: php mysql

我有一个存储朋友的表格如下:

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
                )

1 个答案:

答案 0 :(得分:0)

暂时不要把它当成桌子。

为了有资格成为共同的朋友,用户必须在我的圈子和其他用户的圈子中。集合的交集。

所以你有:

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

写子查询留作练习;)