2014-03-25 36 views
0

我正在做我的第一份工作在PHP/MySQL &我需要帮助。我有一个主表:MySQL查询表

CREATE TABLE `m4l_movies` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `Title` varchar(250) NOT NULL, 
    `Rating` int(11) NOT NULL, 
    `Genre` varchar(250) NOT NULL, 
    `Actors` varchar(250) NOT NULL, 
    `UserID` int(11) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`ID`) 
) ENGINE=MyISAM AUTO_INCREMENT=115 DEFAULT CHARSET=utf8; 

接收用于具有从这些值查找表形式输入:

CREATE TABLE `m4l_actors` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `Actor` varchar(255) NOT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=232 DEFAULT CHARSET=utf8; 

CREATE TABLE `m4l_genre` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `Genre` varchar(255) NOT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=202 DEFAULT CHARSET=utf8; 

CREATE TABLE `m4l_movierating` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `Movie_Rating` varchar(250) NOT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8; 

&我已经创建的视图:

SELECT m4l_movies.ID AS ID, 
    m4l_movies.Title AS Title, 
    m4l_movierating.Movie_Rating AS Rating, 
    m4l_movies.Actors AS Actors, 
    m4l_movies.Genre AS Genre 
FROM m4l_movies 
    JOIN m4l_movierating ON m4l_movierating.ID = m4l_movies.Rating 
    INNER JOIN m4l_genre ON m4l_movies.Genre = m4l_genre.ID 
    INNER JOIN m4l_actors ON m4l_movies.Actors = m4l_actors.ID 
ORDER BY m4l_movies.Title 

这里是我得到的结果:

----------------------------------------------------------------| 
    ID  Title  Rating Actor   Genre    | 
    10  Summer  G   (10,15,25) (45,115,123)  | 
    1  About You G-1  (63,163,405) (3,16,51)   | 
    5  Dog Years P   (45,65,95) (98,163,357)  | 
----------------------------------------------------------------| 

首先,这个视图应该返回超过200条记录。其次,我需要知道如何创建一个查找或其他一些方法来将NAME & GENRE转换回相应的文本值。一些RATING值如何正确执行,但我无法使NAME或GENRE正确执行。我相信这与我加入表格的方式有关,但我无法弄清楚我要出错的地方。有人请帮助我。

好的尝试与菲尔建议做出我已经去除了演员跟着一起,从电影的故事&流派创建movies_genre & movies_actors

DROP TABLE IF EXISTS `m4l_movies`; 
CREATE TABLE `m4l_movies` (
    `ID` int(11) NOT NULL auto_increment, 
    `Title` varchar(250) NOT NULL, 
    `Year` float NOT NULL, 
    `Review` varchar(250) NOT NULL, 
    `Rating` int(11) NOT NULL, 
    `Image` varchar(250) NOT NULL, 
    `Storyline` longtext NOT NULL, 
    `Director` varchar(250) NOT NULL, 
    `UserID` int(11) NOT NULL default '1', 
    PRIMARY KEY (`ID`) 
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 


CREATE TABLE `m4l_movie_actor` (
    movie_id INT(11), 
    actor_id INT(11), 
    PRIMARY KEY (movie_id, actor_id), 
    FOREIGN KEY (movie_id) REFERENCES m4l_movies (ID), 
    FOREIGN KEY (actor_id) REFERENCES m4l_actors (ID) 
); 


CREATE TABLE `m4l_movie_genre` (
    movie_id INT(11), 
    genre_id INT(11), 
    PRIMARY KEY (movie_id, genre_id), 
    FOREIGN KEY (movie_id) REFERENCES m4l_movies (ID), 
    FOREIGN KEY (genre_id) REFERENCES m4l_genre (ID) 
); 


DROP TABLE IF EXISTS m4l_genre; 
CREATE TABLE m4l_genre (
    ID int(11) NOT NULL auto_increment, 
    Genre varchar(250) NOT NULL, 
    PRIMARY KEY (ID) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 


DROP TABLE IF EXISTS m4l_actors; 
CREATE TABLE m4l_actors (
    ID int(11) NOT NULL auto_increment, 
    Actor varchar(255) NOT NULL, 
    PRIMARY KEY (ID) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

但是当我尝试创建movie_actor OR MOVIE_GENRE我得到

9时29分45秒
CREATE TABLE`m4l_movie_actor`(movie_id INT(11),actor_id INT(11),
PRIMARY KEY(movie_id ,actor_id),
外键(movie_id)参考m4l_movies(ID),
外键(actor_id)参考m4l_actors(ID))
错误代码:1215无法添加外键约束
0.000秒

9点四十分56秒CREATE TABLE m4l_movie_genre(movie_id INT(11),genre_id INT(11),
PRIMARY KEY(movie_id,genre_id),
外键(movie_id)参考m4l_movies(ID),
外键(genre_id )参考文献m4l_genre(ID))
错误代码:1215无法添加外键约束
0.016秒

从我可以收集这些,当你有数据类型不匹配仅发生,但我想我拥有所有INT数据类型,所以为什么我收到这个错误?

+0

决不(我的意思是**从不**)将逗号分隔的外键存储在单个字段中。改为使用[联结表](http://en.wikipedia.org/wiki/Junction_table)。 – Phil

+0

菲尔,如果你能解释什么和怎么做,我就是为了它......我只是想让这件事情起作用。 – Les

+0

你有没有打开链接的维基文章? – Phil

回答

2

您似乎已经以不可取的方式存储关系数据的经典失误。

您应该使用junction tables而不是逗号分隔值。例如...

CREATE TABLE `m4l_movies` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `Title` varchar(250) NOT NULL, 
    `Rating` int(11) NOT NULL, 
    -- removed Actors and Genre 
    `UserID` int(11) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`ID`) 
); 

CREATE TABLE `m4l_movie_actor` (
    movie_id INT(11) NOT NULL, 
    actor_id INT(11) NOT NULL, 
    PRIMARY KEY (movie_id, actor_id), 
    FOREIGN KEY (movie_id) REFERENCES m4l_movies (ID), 
    FOREIGN KEY (actor_id) REFERENCES m4l_actors (ID) 
); 

-- repeat for genres 

然后,您可以在结表,并在加入到Actors/Genres表,如

SELECT ... m4l_actors.Actor ... 
FROM m4l_movies 
INNER JOIN m4l_movie_actor ON m4l_movies.ID = m4l_movie_actor.movie_id 
INNER JOIN m4l_actors ON m4l_movie_actor.actor_id = m4l_actors.ID 

如果你想要的结果以逗号分隔的列表,看看GROUP_CONCAT()