问题是获取表列数据并将其用作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。
我应该用什么查询来获得想要的结果?
您是如何创造这个所示的这种美丽的表结构page.is有任何snytax创建表在stackoverflow? – diEcho 2010-05-28 13:12:12
第一个由mysql shell和其他人通过 – George 2010-06-01 21:24:22