Разница между! = И NOT IN в среде MySQL - PullRequest
0 голосов
/ 14 июля 2020

У меня вопрос о разнице между! = И 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, я могу получить правильные результаты. Мне любопытно, в чем разница между этими двумя подходами.

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Вы можете попробовать следующее: я просто немного переставляю столбец перед выполнением фактического logi c

with crt as(
select
case when
id_2 = id_col then id_q
else id_2 end as id_q_final, id_col
from
(select *,
case when
id_q > id_2 then id_q
else
id_2
end as id_col
from friendship) T)
select distinct(page_id) from
likes
inner join
crt on 
crt.id_col = likes.id
where crt.id_q_final = 1 and page_id not in (select page_id from likes where id=1);

Результат теста: 13

0 голосов
/ 14 июля 2020

мы не можем передать несколько значений в! = Например:

Следующий скрипт получает все приложения, чей application_id не равен eeff906835c9bd8f431c33c9b3f5ec6d.

  select * from application where application_id  !='eeff906835c9bd8f431c33c9b3f5ec6d';

NOT IN мы можем передать несколько значений во время фильтрации, например:

select * from application where application_id  not in ( 'eeff906835c9bd8f431c33c9b3f5ec6d','196ec1876359b2bf0640918648c3c8355');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...