2012-06-08 40 views
1

这是电影的在线商店英里数据库estructure:MySQL:错误的查询或数据库结构不好?

enter image description here

而这些都是其创建的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; 

generos

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多个结果!!,也就是重复了在电影台主持36次的36部电影。

我希望你能帮忙!!

+1

您mising条件联接表 – Nico

回答

1

即使是一个差异,这是一个低效率的查询。我会建议一个适当的内部联接。这应做到:

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'; 
+0

在他的模式是没有'id_movie'在'genres',所以你必须加入'genres'和''通过id_genre' movie_genres'。 – hannebaumsaway

+0

啊拍你说得对。我错误地瞥了一眼。 – Ilion

+0

不错....为我工作:) ..我忘记了桌子之间的联盟,所有的答案显示相同的结果,但你的结构更好! – SoldierCorp

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'; 
+0

谢谢你,我的解决方案为我工作:),但句子更结构化@llion – SoldierCorp

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 ; 
+0

谢谢你,我的解决方案为我工作:)但句子更有条理@llion – SoldierCorp

+0

不客气,我给你了内联代码bc编程时使用起来更简单。 @ llion's更清晰,但+1 –