4

最初の MySQL データベースの作業を開始しましたが、単純な問題に遭遇しました。

私は自分の映画を「多対多」の関係でジャンル別に分類しています。

「映画」テーブル
+---------+-------------------+
|movie_id |movie_title |
+---------+-------------------+
|1 |インディアナ・ジョーンズ |
|2 |死者のショーン |
+---------+-------------------+

「ジャンル」テーブル
+---------+-----------+
|genre_id |genre_name |
+---------+-----------+
|1 |冒険 |
|2 |コメディ |
|3 |ホラー |
+---------+-----------+

「movie_genres」テーブル
+---------+---------+
|movie_id |genre_id |
+---------+---------+
|1 |1 |
|2 |2 |
|2 |3 |
+---------+---------+

私がやろうとしているのは、映画のテーブルをジャンル別に検索し、各映画が属するすべてのジャンルを表示することです。たとえば、次のようになります。

「ホラー」で検索しています

+------------------+---------------+
|movie_title |genre_names |
+------------------+---------------+
|ショーン・オブ・ザ・デッド |コメディ、ホラー |
+------------------+---------------+

ホラー映画の検索に使用するクエリを次に示します。

    SELECT m.movi​​e_title, GROUP_CONCAT(g.genre_name SEPARATOR ', ') as Genre_names
    フロム ムービー m
    LEFT JOIN ジャンル_ムービー gm ON gm.movi​​e_id = m.movi​​e_id
    LEFT JOIN ジャンル g ON g.genre_id = gm.genre_id
    GROUP BY m.movi​​e_id
    「%horror%」のようなジャンル名を持つ

私が抱えている問題は、このクエリがフィルタリングする前にすべてのテーブル全体を取得することです。これは非常に非効率です。関連するすべてのジャンルを表示しながら、1 つのジャンルで検索できるより良い方法はありますか?

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

ジャンル ID を movie-table に保存しないのはなぜですか?

このようなもの:

'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 に答える