这是是一个推荐SQL,对用户的推荐用户朋友收藏但是自己并没有收藏的商品
SELECT
DISTINCT user1_id user_id,sku_id
FROM(
SELECT
user1_id,All_sku_id,user2_id,sku_id
FROM(
SELECT
t1.user1_id,All_sku_id,user2_id
FROM(
SELECT
DISTINCT user1_id,
user2_id
FROM(
SELECT user1_id,user2_id FROM friendship_info
UNION
SELECT user2_id as user1_id,user1_id as user2_id FROM friendship_info)t
)t1
JOIN (SELECT user_id,collect_set(sku_id) All_sku_id FROM favor_info group by user_id) t2 ON t1.user1_id=t2.user_id
)t3 JOIN favor_info f ON t3.user2_id=f.user_id
)t4 where user1_id<>user2_id AND NOT array_contains(All_sku_id,sku_id)
ORDER BY user_id,sku_id
总结:这个题本身不难,但是有点绕,把逻辑理清楚了就好了。
我的逻辑是,先找出所有的用户以及他们对应的好友,接着join用户自己的收藏列表,并将这些数据放到一个set集合里面,由于是双面的用户,所以使用去重把互相关注的用户给排除掉。接着能得到一个这样的表,用户自己和,用户自己所收藏的商品。
接下来就简单了,jion用户朋友的收藏列表,将收藏列表的商品和用户自己所收藏的商品作比较,如果不在就留下,在就排除(说明两个人都有关注)
这里值得注意的是 array_contains(All_sku_id,sku_id)
是这个函数,这是一个数据是否在集合里的一个函数,这里的意思就是,sku_id是否在All_sku_id这个集合里面,在就返回TRUE不在就返回false。