使用中间表查询多类型电影的MySQL

使用中间表查询多类型电影的MySQL,mysql,sql,Mysql,Sql,我几乎不使用MySQL,所以我对这个很陌生。我的最终目标是有一个列表,我可以将其放入Java中,其中包含电影id、电影名称和类型列表。我只是想弄明白一个SQL查询(以便以后可以解析其他内容)。我有三张桌子: CREATE TABLE `movies` ( `id` int NOT NULL AUTO_INCREMENT, `title` varchar(100) NOT NULL DEFAULT '', `year` int NOT NULL, PRIMARY KEY(`id`)

我几乎不使用MySQL,所以我对这个很陌生。我的最终目标是有一个列表,我可以将其放入Java中,其中包含电影id、电影名称和类型列表。我只是想弄明白一个SQL查询(以便以后可以解析其他内容)。我有三张桌子:

CREATE TABLE `movies` (
  `id` int NOT NULL AUTO_INCREMENT,
  `title` varchar(100) NOT NULL DEFAULT '',
  `year` int NOT NULL,
  PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `genres` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL DEFAULT '',
  PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `genres_in_movies` (
  `genre_id` int NOT NULL,
  `movie_id` int NOT NULL,
  FOREIGN KEY (`genre_id`) REFERENCES `genres`(`id`),
  FOREIGN KEY (`movie_id`) REFERENCES `movies`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
假设我的表具有以下值:

MOVIES
------
1  Zoolander      2001
2  Citizen Kane   1941
3  Psycho         1960

GENRES
------
1  Comedy
2  Horror
3  Drama
4  Suspense
5  Romance
6  Documentary

GENRES_IN_MOVIES (genre_id, movie_id)
------
1  1  -- Comedy   - Zoolander
3  2  -- Drama    - Citizen Kane
4  2  -- Suspense - Citizen Kane
2  3  -- Horror   - Psycho
5  3  -- Romance  - Psycho
4  3  -- Suspense - Psycho
我希望查询具有以下输出:

MOVIE LIST
------
1  Zoolander     2001  Comedy
2  Citizen Kane  1949  Drama, Suspense
3  Psycho        1960  Horror, Romance, Suspense
我尝试了以下查询:

SELECT movies.*, genres.name
FROM movies 
INNER JOIN genres_in_movies ON genres_in_movies.movie_id = movies.id
INNER JOIN genres ON genres_in_movies.genre_id = genres.id
GROUP BY movies.title;
但它只会给我一个流派名称。看起来是这样的:

MOVIE LIST
------
1  Zoolander     2001  Comedy
2  Citizen Kane  1949  Drama
3  Psycho        1960  Horror

如何检索所有类型?

您可以使用
group\u concat
将多个值放在一起

SELECT m.id, m.title, m.year,
       group_concat(g.name) as genres
FROM movies m
INNER JOIN genres_in_movies ON gm.movie_id = m.id
INNER JOIN genres ON gm.genre_id = g.id
GROUP BY m.id, m.title, m.year

你考虑过group_concat吗?@jarlh我会查一下,老实说,我对SQL还是很陌生的。一般的group BY规则说:“如果指定了group BY子句,SELECT列表中的每个列引用必须标识一个分组列或是一个set函数的参数。”(不过,较旧的MySQL版本不在乎,但较新的版本在乎!)