2009-08-06 56 views
4

问题是获取表列数据并将其用作IN函数的值列表;MySQL - 如何通过值在IN语句中使用子查询

在这个例子中,我创建2个表:电影和流派

表“电影”包含3列:ID,名称和流派。 表“流派”包含2列:id和名称。

+- 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) 

两个表都包含一些虚拟的数据:

+----------+------------+--------------+ 
| 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 | 
+----------+------------+ 

我的目标是让结果是这样的:

+----------+------------+--------------+-----------------------+ 
| 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  | 
+----------+------------+--------------+-----------------------+ 

我使用这个查询,它的部分工作唯一的问题是它使用IN值列表中的movie_genres字段的第一个值。

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 

结果从一个我想有很大的不同:

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

很抱歉,如果我错过了一些数据,我是新来的MySQL。

我应该用什么查询来获得想要的结果?

+0

您是如何创造这个所示的这种美丽的表结构page.is有任何snytax创建表在stackoverflow? – diEcho 2010-05-28 13:12:12

+0

第一个由mysql shell和其他人通过 – George 2010-06-01 21:24:22

回答

5

这是一个糟糕的设计。您应该创建一个many-to-many链接表(movie_id, genre_id)

如果你不能改变这种设计,但是,使用此查询:

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

谢谢。最终查询看起来像这样。 SELECT *,(SELECT GROUP_CONCAT(genre_name)FROM'genres' WHERE FIND_IN_SET(genre_id,movie_genres))AS'movie_genre_names' FROM'movies'; – George 2009-08-06 17:49:11

相关问题