繁体   English   中英

多对多查询,MySQL

[英]Many-to-many query, MySQL

我有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

这返回类似于:

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

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

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

请帮我搞清楚:)

几周前我遇到了这个问题,我的教授给了我一个非常聪明的解决方案:

在子查询中使用Group_Concat函数以逗号分隔值的形式获取结果,然后使用explode / split /等效的语言来循环CSV结果。

http://mahmudahsan.wordpress.com/2008/08/27/mysql-the-group_concat-function/

希望这可以帮助! 这个问题让我感到沮丧一段时间,但我认为这是最简单的解决方案。

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 
;

这基本上是您的查询。 我刚刚添加了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
;

这是数据库工作的方式。 有'方法'可以做你想要的,但老实说,数据库通常不是完成它的正确位置。 这纯粹只是一个临时查询还是将这些结果发送到应用程序? 如果是这样,应用程序将是按照您希望的方式格式化结果的正确位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM