データベースを使用することは、間違いなく最善の方法です。これは基本的なレイアウトです:
映画テーブルから始めます: ID_movie、名前、年など。
ジャンルテーブル:ID_genre、名前。
カテゴリ テーブル: ID_category、名前。
映画は、ジャンル/カテゴリと多対多の関係にあります。そのため、映画とジャンル/カテゴリ間のブリッジ テーブルが必要になります。この表には、映画とジャンル/カテゴリの組み合わせが表示されます。
movie_genre テーブル: ID_movies、ID_genre
movie_category テーブル: ID_movies、ID_category
これは、テーブル構造とサンプル データを作成するための SQL クエリです。
CREATE TABLE movie(
id_movie INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
release_date DATETIME
);
CREATE TABLE genre(
id_genre INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE category(
id_category INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE movie_genre (
ID_movie_genre INT AUTO_INCREMENT PRIMARY KEY,
ID_movie INT,
ID_genre INT,
UNIQUE (ID_movie,ID_genre),
INDEX (ID_movie,ID_genre)
);
CREATE TABLE movie_category (
ID_movie INT,
ID_category INT
);
INSERT INTO movie (name, release_date) VALUES
('Transformers 3 Dark of the moon','2012-01-01'),
('Harry potter and the deathly hallows 2','2011-01-01'),
('Pirates of the caribbean. On stranger tides', '2012-01-01');
INSERT INTO genre (name) VALUES ('Action'), ('Fantasy'), ('Comedy');
INSERT INTO movie_genre(id_movie, id_genre) VALUES (1,1), (2,1),(2,2),(3,2),(3,1);
SQL フィドルのデモ
以下、ご指摘に対する回答です。年のみが必要な場合は、release_date を year に変更できます。1 つの方法は、それらを文字列値 (release_date DATETIME の代わりに Year VARCHAR(4)) に変換することです。さらに、ブリッジ テーブルに一意のインデックスを含めました。インデックスを使用すると、クエリ時間が短縮されます。
以下に、映画番号 2 から名前とジャンルを取得するクエリの例を示します。SELECT m.name AS Movie, g.name AS Genre FROM (movie AS m left JOIN movie_genre AS mg ON mg.id_movie = m.id_movie) g.id_genre = mg.ID_genre WHERE m.id_movie = 2; のようにジャンルを結合します。