1

これは、映画オンライン ストアの mi データベースの構造です。

ここに画像の説明を入力

そして、これらはその作成のためのSQLステートメントです

映画

CREATE TABLE `movies` (
  `id_movie` varchar(4) NOT NULL default '',
  `nom_movie` varchar(30) default NULL,
  `detall_movie` text,
  `precio_movie` varchar(6) default NULL,
  `img_rut_movie` varchar(50) default NULL,
  PRIMARY KEY  (`id_movie`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ジェネロス

CREATE TABLE `genres` (
  `id_genre` varchar(3) collate utf8_bin NOT NULL default '',
  `nom_genre` varchar(20) collate utf8_bin default NULL,
  PRIMARY KEY  (`id_genero`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

movie_genero

CREATE TABLE `movie_genre` (
  `id_movie` varchar(4) collate utf8_bin default NULL,
  `id_genre` varchar(3) collate utf8_bin default NULL,
  FOREIGN KEY(id_movie) REFERENCES movies(id_movie),
  FOREIGN KEY(id_genero) REFERENCES generos(id_genero)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

たとえば、「アクション」というジャンルに属する映画を表示したい:

SELECT nom_movie FROM movies, genres, movie_genre WHERE genres.nom_genre = 'action';

しかし、1200 以上の結果が表示されます!! つまり、movies テーブルでホストされている 36 の映画を 36 回繰り返します。

あなたが助けてくれることを願っています!!

4

3 に答える 3

1

非効率的なクエリである Distinct を使用しても。適切な内部結合をお勧めします。これはそれを行う必要があります:

select 
  m.nom_movie 
FROM 
  movies 
inner join
  movie_genre mg
on
  m.id_movie=mg.id_movie 
inner join 
  genres g 
on 
  mg.id_genre=g.id_genre 
where 
  g.nom_genre = 'action';
于 2012-06-08T19:55:10.207 に答える
1
SELECT movies.nom_movie
FROM movies, genres, movie_genre
WHERE
    movies.id_movie = movie_genre.id_movie
    and movie_genre.id_genre = genre.id_genre
    and genres.nom_genre = 'action';
于 2012-06-08T19:56:12.937 に答える
1

構造は完璧です。このクエリを使用するだけです。

 SELECT nom_movie FROM movies, genres, movie_genre WHERE genres.nom_genre = 'action' AND genres.id_genre= movie_genre.id_genre AND movie_genre.id_movie=movies.id_movie ;
于 2012-06-08T19:57:53.173 に答える