MySQL выбрать жанр выпуска (php) - PullRequest
2 голосов
/ 24 марта 2011

У меня есть база данных:

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

Ответы [ 2 ]

4 голосов
/ 24 марта 2011

Не хранить список атрибутов через запятую в столбце базы данных.

Вместо этого есть 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 голосов
/ 24 марта 2011

Проблема, с которой вы здесь сталкиваетесь, заключается в реализации требования отношения 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

Надеюсь, это поможет.

...