2012-06-08 2 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; 

И, например, Я хочу, чтобы показать фильмы, которые принадлежат к жанру «Action»:

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' и' 'movie_genres' по id_genre'. – 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 Clearer, хотя +1 –

Смежные вопросы