У меня вопрос о разнице между! = И NOT IN в среде MySQL. Исходный вопрос выглядит следующим образом:
Таблица: Дружба
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| user1_id | int |
| user2_id | int |
+---------------+---------+
(user1_id, user2_id) - это первичный ключ для этой таблицы. Каждая строка этой таблицы указывает на наличие дружеских отношений между user1_id и user2_id.
Таблица: Нравится
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| user_id | int |
| page_id | int |
+-------------+---------+
(user_id, page_id) - это первичный ключ для этой таблицы. Каждая строка этой таблицы указывает, что user_id любит page_id.
Напишите запрос SQL, чтобы рекомендовать страницы пользователю с user_id = 1, используя страницы, которые понравились вашим друзьям. Он не должен рекомендовать страницы, которые вам уже понравились.
Возвращать таблицу результатов в любом порядке без дубликатов.
Формат результата запроса находится в следующем примере:
Таблица дружбы:
+----------+----------+
| user1_id | user2_id |
+----------+----------+
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 2 | 3 |
| 2 | 4 |
| 2 | 5 |
| 6 | 1 |
+----------+----------+
Таблица лайков:
+---------+---------+
| user_id | page_id |
+---------+---------+
| 1 | 88 |
| 2 | 23 |
| 3 | 24 |
| 4 | 56 |
| 5 | 11 |
| 6 | 33 |
| 2 | 77 |
| 3 | 77 |
| 6 | 88 |
+---------+---------+
Таблица результатов:
+------------------+
| recommended_page |
+------------------+
| 23 |
| 24 |
| 56 |
| 33 |
| 77 |
+------------------+
Первый пользователь дружит с пользователями 2, 3, 4 и 6. Предлагаемые страницы: 23 от пользователя 2, 24 от пользователя 3, 56 от пользователя 3 и 33 от пользователя 6. Страница 77 предлагается как пользователем 2, так и пользователем 3. Страница 88 не предлагается, потому что пользователю 1 она уже нравится.
И мой подход:
# Write your MySQL query statement below
select distinct
page_id as 'recommended_page'
from likes
where user_id in (
(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)
) and page_id <> (
select
page_id
from likes
where user_id = 1
)
Но я получу NULL как результат для следующего тестового случая:
{"headers":{"Friendship":["user1_id","user2_id"],
"Likes":["user_id","page_id"]},
"rows":{"Friendship":[[1,3],[1,5],[1,6],[2,3],[3,5],[3,9],[4,6],[5,9],[8,9]],
"Likes":[[6,13],[8,10],[9,14]]}}
Если я переключусь на предложение IN, я могу получить правильные результаты. Мне любопытно, в чем разница между этими двумя подходами.
Спасибо за вашу помощь.