SQL:通过关系表仅选择满足条件的行

时间:2019-05-16 09:56:09

标签: mysql sql

我有两个表,只有在第二个表中满足所有特定条件时,才需要从第一个表中选择值。让我们在一个例子上做更多的解释。

第一张桌子

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 个答案:

答案 0 :(得分:2)

您可以在下面尝试-

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 :(得分:1)

一种方法使用group byhaving

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)上的索引,这可能是所有替代方法中性能最好的。

答案 2 :(得分:0)

这很容易完成,只需使用join子句即可。

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)

答案 3 :(得分:0)

使用JOIN从2个表中获取相关数据(基于ID)并使用WHERE条件过滤结果

SELECT secondTable.id, firstTable.movie
FROM secondTable
JOIN firstTable ON secondTable.movie_id = firstTable.id
WHERE secondTable.user_id IN (1, 3)

答案 4 :(得分:0)

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)