多对多查询,MySQL

eve*_*aug 5 mysql database many-to-many

我有3个这样的表:

电影:

  • movie_id(int)
  • movie_title(varchar)
  • movie_runtime(int)
  • movie_releaseYear(int)
  • ...

类型:

  • genre_id(int)
  • genre_name(varchar)

movieGenres:

  • movieGenre_id(int)
  • movieGenre_movieId(int)
  • movieGenre_genreId(int)

电影可以包括许多类型.
我想抓住电影片名,运行时和发行年及其类型.我怎么能在一个查询中做到这一点?

我试着这样做:

SELECT u.movie_title, u.movie_runtime, u.movie_releaseYear, a.genre_name 
FROM movieGenres ua 
LEFT JOIN movies u ON u.movie_id = ua.movieGenre_filmId 
LEFT JOIN genres a ON a.genre_id = ua.movieGenre_genreId
LIMIT 0,10
Run Code Online (Sandbox Code Playgroud)

这返回类似于:

罗宾汉_ 101 _ 2001 _冒险
罗宾汉_ 101 _ 2001 _动作
罗宾汉_ 101 _ 2001 _戏剧
防火墙_ 98 _ 2003 _动作
防火墙_ 98 _ 2003 _剧情

我不想重复我已经知道的信息.我希望它显示如下:

罗宾汉_ 101 _ 2001 _冒险_动作_戏剧
防火墙_ 98 _ 2003 _动作_戏剧

请帮我搞清楚:)

Rol*_*DBA 3

SELECT
    u.movie_title,
    u.movie_runtime,
    u.movie_releaseYear,
    GROUP_CONCAT(a.genre_name) genre
FROM
    movieGenres ua  
    INNER JOIN movies u ON u.movie_id = ua.movieGenre_filmId  
    INNER JOIN genres a ON a.genre_id = ua.movieGenre_genreId
GROUP BY
    u.movie_title,
    u.movie_runtime,
    u.movie_releaseYear
LIMIT 0,10 
;
Run Code Online (Sandbox Code Playgroud)

这本质上是您的查询。我刚刚添加了GROUP BY子句和GROUP_CONCAT函数。默认分隔符是逗号 (,)。如果您想要以空格分隔流派列表,请使用 GROUP_CONCAT 函数执行此操作:

SELECT
    u.movie_title,
    u.movie_runtime,
    u.movie_releaseYear,
    GROUP_CONCAT(a.genre_name SEPARATOR ' ') genre
FROM
    movieGenres ua  
    INNER JOIN movies u ON u.movie_id = ua.movieGenre_filmId  
    INNER JOIN genres a ON a.genre_id = ua.movieGenre_genreId
GROUP BY
    u.movie_title,
    u.movie_runtime,
    u.movie_releaseYear
LIMIT 0,10
;
Run Code Online (Sandbox Code Playgroud)