我有一个数据库:
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
我如何从所有数据库的
genres
中选择独特的流派。
我需要下一个:动作/冒险/剧情/家庭/奇幻/历史/情节剧/惊悚/战争
如何观看特定类型的电影?
选择
movie_name
从movies
哪里genre
喜欢??
但他不仅能带来戏剧,还能带来情节剧。
如何搜索特定类型? 可能是:
选择
movie_name
来自 movies
movie_name
喜欢 %stone%
和`流派喜欢“戏剧”。
不要在数据库列中存储以逗号分隔的属性列表。
相反,有 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
那么你的问题就会变得非常非常简单。
您在这里面临的问题是实现 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
希望有帮助。