2011-03-24 34 views
2

我有一个数据库:MySQL选择流派问题。 (PHP)

id  |    movie_name    |   genres 
1  |     Die Hard    |  Action, Thriller 
2  |    Gladiator    | Adventure, Action, Drama, History 
3  | Harry Potter and the Sorcerers Stone | Fantasy, Adventure, Family 
4  |    Pearl Harbor    |  Action, Melodrama, War 

1)如何我可以从所有的数据库genres选择独特的风格。 我需要下:动作/冒险/剧情/家庭/奇幻/历史/音乐剧/惊悚/战争

2)我怎么能看电影某一类型?

SELECT `movie_name` FROM `movies` WHERE `genre` LIKE ?? 

但他也不仅能带来戏剧,还能带来情节剧。

3)如何搜索特定的流派? 可能是:

SELECT `movie_name` FROm `movies` WHERE `movie_name` LIKE `%stone%` AND `genres LIKE 'drama'. 

对不起,英语不好。谢谢!

回答

4

不要在数据库列中存储以逗号分隔的属性列表。

取而代之的是,有3个表:

Movies (id, movie_name) 

id | movie_name 
---+-------------------------------------- 
1 | Die Hard 
2 | Gladiator 
3 | Harry Potter and the Sorcerers Stone 
4 | Pearl Harbor 

Genres (id, genre_name) 

id | genre_name 
---+------------ 
1 | Action 
2 | Thriller 
3 | Adventure 
4 | Drama 
5 | History 
6 | Fantasy 
7 | Family 
8 | Melodrama 
9 | War 

MovieGenre (movie, genre) 

Movie | Genre 
------+------- 
    1 | 1 
    1 | 2 
    2 | 1 
    2 | 3 
    2 | 4 
    2 | 5 
    3 | 3 
    3 | 6 
    3 | 7 
    4 | 1 
    4 | 8 
    4 | 9 

那么你的问题变得非常非常简单。

+1

非常感谢! <3 – Isis 2011-03-24 19:01:36

2

您在这里遇到的问题是实施N到N关系要求。

由于电影之间的关系是多对多关系,因此将其存储在数据库模式中的正确方法是将关系维护在单独的表中。

为了这个练习,我们称这个表为“Movie_Genre_Relationship”。

Movie_Genre_Relationship 
Movie_id | Genre_id 
1  | 1 
1  | 2 

假设下面的电影和类型表:

Movies 
Movie_id | Movie_Name 
1  | Die Hard 

Genres 
Genre_id | Genre_Name 
1  | Action 
2  | Thriller 

然后可以根据虎胆龙威既是行动&惊悚电影,你应该在关系表中两行,这样它存储搜索所有动作电影做:

select * from Movies m 
inner join Movies_Genres_Relationship r on m.movie_id = r.movie_id 
where r.genre_id = 1 

希望它有帮助。