2009-08-06 9 views
4

La question est d'obtenir des données de colonne de table et de l'utiliser comme liste de valeurs pour la fonction IN;MySQL - Comment utiliser la sous-requête dans l'instruction IN par la valeur

Pour cet exemple, je crée 2 tables: films et genres

Table des "films" contient 3 colonnes: id, nom et genre. Le tableau "genres" contient 2 colonnes: identifiant et nom.

+- movies-+ 
|   |- movie_id - int(11) - AUTO_INCREMENT - PRIMARY 
|   |- movie_name - varchar(255) 
|   |- movie_genres - varchar(255) 
| 
|   
+- genres-+ 
      |- genre_id - int(11) - AUTO_INCREMENT - PRIMARY 
      |- genre_name - varchar(255) 

Les deux tableaux contiennent certaines données fictives:

+----------+------------+--------------+ 
| movie_id | movie_name | movie_genres | 
+----------+------------+--------------+ 
|  1 | MOVIE 1 | 2,3,1  | 
|  2 | MOVIE 2 | 2,4   | 
|  3 | MOVIE 3 | 1,3   | 
|  4 | MOVIE 4 | 3,4   | 
+----------+------------+--------------+ 

+----------+------------+ 
| genre_id | genre_name | 
+----------+------------+ 
|  1 | Comedy  | 
|  2 | Fantasy | 
|  3 | Action  | 
|  4 | Mystery | 
+----------+------------+ 

Mon but est d'obtenir le résultat comme celui-ci:

+----------+------------+--------------+-----------------------+ 
| movie_id | movie_name | movie_genres | movie_genre_names | 
+----------+------------+--------------+-----------------------+ 
|  1 | MOVIE 1 | 2,3,1  | Fantasy,Action,Comedy | 
|  2 | MOVIE 2 | 2,4   | Fantasy,Mystery  | 
|  3 | MOVIE 3 | 1,3   | Comedy,Action   | 
|  4 | MOVIE 4 | 3,4   | Action,Mystery  | 
+----------+------------+--------------+-----------------------+ 

J'utilise cette requête et cela fonctionne en partie seul problème est qu'il utilise la première valeur du champ movie_genres dans la liste de valeurs IN.

SELECT `m` . * , GROUP_CONCAT(`g`.`genre_name`) AS `movie_genre_names` 
FROM `genres` AS `g` 
LEFT JOIN `movies` AS `m` ON (`g`.`genre_id` 
IN (
`m`.`movie_genres` 
)) 
WHERE `g`.`genre_id` 
IN (
(
SELECT `movie_genres` 
FROM `movies` 
WHERE `movie_id` =1 
) 
) 
GROUP BY 1 =1 

Les résultats diffèrent grandement de celui que je veux:

+----------+------------+--------------+-------------------+ 
| movie_id | movie_name | movie_genres | movie_genre_names | 
+----------+------------+--------------+-------------------+ 
|  1 | MOVIE 1 | 2,3,1  | Fantasy,Fantasy | 
+----------+------------+--------------+-------------------+ 

Désolé si je manquais certaines données, je suis nouveau à MySQL.

Quelle requête dois-je utiliser pour obtenir les résultats voulus?

+0

how do u créer cette belle structure de table figurant sur ce page.is-il snytax pour créer table dans stackoverflow? – diEcho

+0

Premier à la main et d'autres par shell mysql – George

Répondre

5

Ceci est une mauvaise conception. Vous devez créer une table de lien many-to-many(movie_id, genre_id)

Si vous ne pouvez pas changer cette conception, cependant, utilisez cette requête:

SELECT movie.* 
     (
     SELECT GROUP_CONCAT(genre_name) 
     FROM genres 
     WHERE find_in_set(genre_id, movie_genres) 
     ) as movie_genre_names 
FROM movies 
+0

Merci. La requête finale ressemble à ceci. SELECT *, (SELECT GROUP_CONCAT (nom_générique) FROM 'genres' WHERE FIND_IN_SET (genre_id, movie_genres)) AS' movie_genre_names' FROM 'movies'; – George

Questions connexes