SQL: выбирайте только условия заполнения строк через таблицу отношений - PullRequest
2 голосов
/ 16 мая 2019

У меня есть две таблицы, и мне нужно выбирать значения из первой только тогда, когда во второй таблице выполнены все определенные условия.Позвольте объяснить больше на примере.

Первая таблица

id       movie    
---|--------------
1  | Matrix       
2  | Pulp Fiction 
3  | Avengers     
4  | Commando     

Вторая таблица

id    movie_id    user_id
---|-----------|---
1  | 1         |  1
2  | 1         |  2
3  | 1         |  3
4  | 2         |  1
5  | 2         |  4
6  | 3         |  2
7  | 4         |  1
8  | 4         |  3

И из техТаблицы мне нужно найти только фильмы, которые видели пользователи 1 и 3.В результате мне нужно увидеть

Требуемый результат

id    movie   
---|--------
1  | Matrix      
4  | Commando

Я пробовал некоторые запросы, но не могу понять окончательный результат.В конце я буду "construncting" этот запрос на основе пользователей, выбранных в качестве входных данных.Так что, в конце концов, может быть и 5 пользователей, и мне нужно будет найти только фильмы, все они видели.Поэтому, пожалуйста, имейте это в виду.

Вся помощь и идеи приветствуются, спасибо.

Ответы [ 5 ]

2 голосов
/ 16 мая 2019

Вы можете попробовать ниже -

select b.id, b.movie from 
Secondtable a inner join Firsttable b 
on a.movie_id=b.id 
where user_id in (1,3)
group by b.id, b.movie
having count(distinct user_id)=2
1 голос
/ 16 мая 2019

Один метод использует group by и having:

select t1.id, t1.name
from t1 join
     t2
     on t1.id = t2.movie_id
where t2.user_id in (1, 3)
group by t1.id, t1.name
having count(*) = 2;

Этот подход довольно гибок в логике, которую он может реализовать - в основном путем изменения предложения having.

Альтернатива, которую я бы предложил без агрегирования, использует exists:

select t1.*
from t1
where exists (select 1
              from t2
              where t2.movie_id = t1.id and t2.user_id = 1
             ) and
      exists (select 1
              from t2
              where t2.movie_id = t1.id and t2.user_id = 3
             );

С индексом t2(movie_id, user_id) это, вероятно, лучшая производительность среди всех альтернатив.

0 голосов
/ 16 мая 2019

Оператор DISTINCT используется для возврата только разных значений.

Вы можете попробовать это. Я использовал имя таблицы как Firsttable и Secondtable

select DISTINCT f.id, f.movie from Firsttable f join Secondtable s on f.id = s.movie_id 
where s.user_id in (1, 3)
0 голосов
/ 16 мая 2019

Используйте JOIN для получения связанных данных из 2 таблиц (на основе идентификатора) и фильтрации результатов с условием WHERE

SELECT secondTable.id, firstTable.movie
FROM secondTable
JOIN firstTable ON secondTable.movie_id = firstTable.id
WHERE secondTable.user_id IN (1, 3)
0 голосов
/ 16 мая 2019

Это легко выполнить. Просто используйте условие соединения. Как показано ниже:

select
    distinct b.user_id,a.move
from
    table1 a
join
    table2 b on a.id = b.movie_id and b.user_id in (1,3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...