2016-04-18 2 views
0

Ich benutze kaum MySQL, also bin ich sehr neu dazu. Mein Endziel ist eine Liste, die ich in Java einfügen kann, die eine Film-ID, einen Filmnamen und eine Liste von Genres enthält. Ich versuche nur, eine SQL-Abfrage herauszufinden (damit ich die anderen Dinge später analysieren kann). Ich habe drei Tabellen:MySQL-Abfrage für Filme mit mehreren Genres unter Verwendung einer Zwischentabelle

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; 

Können sagen, meine Tabellen die folgenden Werte haben:

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 

Ich möchte die folgende Ausgabe mit meiner Anfrage:

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

ich diese Abfrage versucht:

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; 

Aber es werde mir nur einen Genre-Namen geben. So sieht es so aus:

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

Wie kann ich alle Genres abrufen?

+0

Sie Group_concat betrachtet haben? – jarlh

+0

@jarlh Ich werde das nachschlagen, ich bin ehrlich gesagt noch sehr neu in SQL – Alex

+0

Die allgemeine GROUP BY-Regel besagt: "Wenn eine GROUP BY-Klausel angegeben ist, muss jede Spaltenreferenz in der SELECT-Liste entweder eine Gruppierungsspalte oder angeben sei das Argument einer gesetzten Funktion. " (Ältere MySQL-Versionen sind jedoch egal, aber neuere tun!) – jarlh

Antwort

3

können Sie group_concat verwenden mehrere Werte zusammen

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 
Verwandte Themen