我在MoviesGenres之间有很多关系。我想做的是查询Action Comedy Movies。这与我所获得的接近:

SELECT * FROM movies
JOIN movies_genre ON (movies.id = movies_genre.movie_id)
JOIN genres ON (movies_genre.genre_id = genres.id)
WHERE (
  genres.genre = "Comedy" OR
  genres.genre = "Action & Adventure"
)


但这给了我所有的喜剧或冒险电影。如果将“或”更改为“与”,则返回一个空表。有一个简单的方法可以通过一个查询来做到这一点吗?

最佳答案

您需要有关电影的信息,因此SELECT *是不合适的。以下查询返回与两种流派都匹配的电影ID:

SELECT mg.movie_id
FROM movies_genre mg JOIN
     genres g
     ON mg.genre_id = g.id
WHERE g.genre IN ('Comedy', 'Action & Adventure')
GROUP BY mg.movie_id
HAVING COUNT(*) = 2;


笔记:


表别名使查询的编写和读取更加容易。
IN比一堆OR表达式更明智。
HAVING子句计算匹配流派的数量。假定类型不重复。
如果需要完整的电影信息,则可以使用其他逻辑将其加入。

关于mysql - SQL查询在多对多JOIN中存在多个关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41174137/

10-11 01:34