【问题标题】:MySQL select genres issue (php)MySQL 选择流派问题 (php)
【发布时间】:2011-07-22 09:17:42
【问题描述】:

我有一个数据库:

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'.

【问题讨论】:

    标签: php mysql select search sql-like


    【解决方案1】:

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

    相反,有 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
    

    然后你的问题就变得简单多了。

    【讨论】:

      【解决方案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
      

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2016-02-18
        • 1970-01-01
        • 2015-02-03
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多