我在Movies
和Genres
之间有很多关系。我想做的是查询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/