2016-11-29 127 views
3

我有一个标准化的表的SQL查询:基于其他表

`Table: TheMovies` 
id  | MovieName 
--------------------- 
1  | Zootopia 
2  | Moana 
3  | Toy Story 

`Table: TheGenres` 
id  | GenreName 
--------------------- 
21  | Action 
22  | Animation 
23  | Adventure 

`Table: mMoviesGenres` 
movieID | genreID 
--------------------- 
1  | 21 
1  | 23 
2  | 22 
2  | 21 
3  | 23 
3  | 21 

一切工作正常,但我需要一个查询,它会显示我在同一流派相似的电影(在我们的例子中,我们需要MovieID类似电影= 1,应该输出MovieID = 3作为结果)。

你可以给我一个SQL查询,所以我有一个这样做的基本思路,能够创建更高级的查询?

我的查询,到目前为止,是:

SELECT 
    TheMovies.* 
FROM 
    mMoviesGenres 
     JOIN TheMovies ON mMoviesGenres.movieID = TheMovies.id 
WHERE 
    mMoviesGenres.genreID IN 
     (
      SELECT 
       genreID 
      FROM 
       mMoviesGenres 
      WHERE 
       movieID = 1 
     ) 

**在我看来,该表:TheMovies不需要做什么,我问

+1

这是MySQL还是SQL Server?另外,你已经尝试过了什么?你究竟在干什么? –

+0

我尝试这样做:SELECT TheMovies * FROM mMoviesGenres \t JOIN TheMovies ON mMoviesGenres.movi​​eID = TheMovies.id \t WHERE mMoviesGenres.genreID \t IN(SELECT genreID FROM mMoviesGenres WHERE movieID = 1 – Coder

+0

仍是问题的MySQL或SQL – C4u

回答

2

尝试此查询:

SELECT m2.movieId 
FROM mMoviesGenres m1 
INNER JOIN mMoviesGenres m2 
    ON m1.genreID = m2.genreID 
WHERE m1.movieId = 1 AND 
     m2.movieId <> 1 
GROUP BY m2.movieId 
HAVING COUNT(*) = (SELECT COUNT(*) FROM mMoviesGenres WHERE movieId = 1) 

更新:

如果你想找到MOV IES这是对于至少两个类型相似,然后使用这个HAVING条款:

HAVING COUNT(*) >= 2 
+0

这可以配对而不使用MovieName,而是ID? – Coder

+0

这并不检查所有类型是否与其他电影匹配 – Coder

+0

@PHPLover我更新了我的答案,请再试一次。 –

0
SELECT M.id FROM TheMovies M 
LEFT JOIN mMoviesGenres MG ON M.id = MG.movieID 
LEFT JOIN TheGenres G ON MG.genreID = G.id 

你正在与你尝试了正确的附近,但你以错误的顺序得到了它一些。从TheMovies开始,因为它包含您之后的ID。然后添加mMoviesGenres,因为它是您尝试匹配的两个表之间的链接。最后添加流派,这将能够检查哪些电影是相关的。

+0

这个作品,但它只是显示所有电影,我需要的是只有电影匹配所有流派将被显示所以,如果我搜索对于MovieID = 1类似的电影,则仅显示具有以下内容的电影:动作和冒险两者都将被显示 – Coder