2016-04-18 17 views
0

私はほとんどMySQLを使用していないので、これはとても新しいです。私の最終目標は、映画のID、映画の名前、ジャンルのリストを含むJavaに入れることができるリストを持つことです。私はSQLクエリーを理解しようとしているだけなので(後で他のものを解析できるように)中間テーブルを使用して複数のジャンルの映画のMySQLクエリ

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; 

が私のテーブルは、次の値を持っているとしましょう:私は3つのテーブルを持っている

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

が、私はこのクエリを試してみました:私のクエリでは、次の出力が
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 

私が欲しい

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; 

しかし、私には1つのジャンル名しか与えられません。だから、次のようになります。

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

は、どのように私は、すべてのジャンルを検索することができますか?

+0

複数の値を入れてgroup_concatを使用することができますか? – jarlh

+0

@jarlh私はそれを見ていますが、正直なところSQLの新機能はまだありません – Alex

+0

一般的なGROUP BYルールは次のように言います: "GROUP BY句が指定されている場合、SELECTリストの各列参照は、セット関数の議論になります。 " (しかし、古いMySQLのバージョンは気にしませんが、新しいバージョンです!) – jarlh

答えて

3

あなたはGROUP_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 
関連する問題