4

我已经开始研究我的第一个 MySQL 数据库,但遇到了一个简单的问题。

我的电影按“多对多”关系按类型分类:

“电影”表
+---------+--------------------+
|movie_id |movie_title |
+---------+--------------------+
|1 |印第安纳琼斯 |
|2 |死者肖恩 |
+---------+--------------------+

“流派”表
+---------+-----------+
|流派 ID |流派名称 |
+---------+-----------+
|1 |冒险 |
|2 |喜剧 |
|3 |恐怖 |
+---------+-----------+

'movie_genres' 表
+---------+---------+
|movie_id |流派_id |
+---------+---------+
|1 |1 |
|2 |2 |
|2 |3 |
+---------+---------+

我要做的是按流派搜索我的电影表,并显示每部电影的所有流派,例如:

搜索“恐怖”

+------------------+--------------+
|电影名称 |类型名称 |
+------------------+--------------+
|死者肖恩 |喜剧,恐怖 |
+------------------+--------------+

这是我用来搜索恐怖电影的查询

    选择 m.movi​​e_title, GROUP_CONCAT(g.genre_name SEPARATOR ', ') 作为流派名称
    FROM 电影
    左加入genre_movies gm ON gm.movi​​e_id = m.movi​​e_id
    LEFT JOIN 流派 g ON g.genre_id = gm.genre_id
    按 m.movi​​e_id 分组
    有流派名称 LIKE '%horror%'

我遇到的问题是,此查询在过滤之前检索了所有表的全部内容,我认为这是非常低效的。有没有更好的方法可以在显示所有相关类型的同时按一种类型进行搜索?

4

3 回答 3

3

试试这个:

SELECT m.movie_title, A.genre_names
FROM movies m
INNER JOIN (SELECT gm.movie_id, GROUP_CONCAT(g.genre_name SEPARATOR ', ') AS genre_names
    FROM genre_movies gm INNER JOIN genres g ON g.genre_id = gm.genre_id
    GROUP BY gm.movie_id) AS A ON m.movie_id = A.movie_id 
WHERE genre_names LIKE '%horror%'
于 2012-11-23T07:09:33.790 回答
1

为什么不将genre_id 保存在电影表中?

像这样的东西:

'movies' Table
+---------+------------+---------------------+
|movie_id |movie_genre |movie_title          |
+---------+----------------------------------+
|1        |1           | Indiana Jones       |
|2        |2 ,3        | Shaun of the Dead   |
+---------+----------------------------------+

所以你只需要2张桌子。您可以轻松过滤查询中的数据。

我要做的是按流派搜索我的电影表,并显示每部电影的所有流派,例如:

可能是这样的:

SELECT fields FROM table WHERE movie_genre LIKE %movie_genre_id%
于 2012-11-23T07:05:31.963 回答
1
SELECT m.movie_title, GROUP_CONCAT(g.genre_name SEPARATOR ', ') as genre_names
FROM  movies m
      INNER JOIN
      (
        SELECT gm.movie_id
        FROM   genre_movies gm 
               INNER JOIN genres g 
                  ON g.genre_id = gm.genre_id
        WHERE  g.genre_name = 'horror'
        GROUP BY gm.movie_id
      ) a ON a.movie_id = m.movie_id
      INNER JOIN genre_movies gm ON gm.movie_id = m.movie_id
      INNER JOIN genres g ON g.genre_id = gm.genre_id
GROUP BY m.movie_id
于 2012-11-23T07:21:11.393 回答