MySQL数据表数据
DROP TABLE IF EXISTS `friendship`;
CREATE TABLE `friendship` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`user1_id` int(11) DEFAULT NULL,
`user2_id` int(11) DEFAULT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `friendship` VALUES (1,1,2),(2,1,3),(3,1,4),(4,2,3),(5,2,4),(6,2,5),(7,6,1);
DROP TABLE IF EXISTS `likes`;
CREATE TABLE `likes` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`page_id` int(11) DEFAULT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `likes` VALUES (1,1,88),(2,2,23),(3,3,34),(4,4,56),(5,5,11),(6,6,33),(7,2,77),(8,3,77),(9,6,88);
friendship 每一行代表着 user1_id 和 user2_id 之间存在着朋友关系
likes 每一行代表着 user_id 喜欢 page_id
写一段 SQL 向user_id = 1 的用户,推荐其朋友们喜欢的页面。不要推荐该用户已喜欢。
用户1 同 用户2, 3, 4, 6 是朋友关系。
推荐页面为: 页面23 来自于 用户2,
页面24 来自于 用户3,
页面56 来自于 用户3
以及 页面33 来自于 用户6。
页面77 同时被 用户2 和 用户3 推荐。
页面88 没有被推荐,因为 用户1 已经喜欢了它。
先找出所有 1 的好友 然后选出好友的页面,并且页面不在 1 的里面
SELECT distinct page_id recommended_page FROM likes WHERE user_id IN
(
SELECT * FROM (
(SELECT user2_id AS user_id FROM Friendship WHERE user1_id = 1 )
UNION
(SELECT user1_id AS user_id FROM Friendship WHERE user2_id = 1 )
) a
)
AND
page_id NOT IN (SELECT page_id FROM likes WHERE user_id=1);