Nerian
Новичок
Выбор данных из базы данных со связями многие ко многим.
Всем привет. Помогите пожалуйсто оптимально выбрать из базы данных данные связанные связью многие ко многим.
Имееться три остонвых таблицы:
Фильмы, Жарны, Актёры. Связаны двумя дополнительными таблицами ФильмыЖанры, ФильмыАктёры.
Требуеться на выходе для всех фильмов получить информацию вида:
Имя Фильма1 / Жанр1, Жанр2, ... / Актёр1, Акрёт2, Актёр3 ... /
Имя Фильма2 / Жанр1, Жанр2, ... / Актёр1, Акрёт2, Актёр3 ... /
Как я понимаю связал я всё правильно, т.к. у фильма может быть много жанров, и один и тот же жанр может быть у многих фильмов, тоже самое и с актёрами.
Только вот как выбрать это более оптимально?
Для моего примера легко получить таблицу вида:
Имя фильма / Жарн / Имя актёра
Имя Фильма 1 / Жанр1 / Актёр1
Имя фильма 1 / Жанр1 / Актёр2
Имя фильма 1 / Жанр2 / Актёр1
Имя фильма 1 / Жанр2 / Актёр2
Имя фильма 2 / Жанр1 / Актёр1
и тд...
И ещё.. Возмножно ли получить на выходе требуемый результат одинм запросом или двумя тремя? Так как если список будет состоять из 100 или даже 1000 фильмов, чтобы извлечь такую информацию потребуеться 100х2+1 или 1000х2+1 запросов.
Пока я временно делаю это тремя запросами: выбираю всех актёров, выбираю все жанры, выбираю все фильмы. И уже на php пишу код который сопостовляет (работает быстрее чем 1000х2+1 запрос).
Вопщем кто что думает по этому поводу, очень важно ваще мнение, примеры тоже будут кстати..
-~{}~ 18.10.05 00:59:
Пока вот что смог придумать: (Кто что может по этому поводу сказать? )
Всем привет. Помогите пожалуйсто оптимально выбрать из базы данных данные связанные связью многие ко многим.
Имееться три остонвых таблицы:
Фильмы, Жарны, Актёры. Связаны двумя дополнительными таблицами ФильмыЖанры, ФильмыАктёры.
Требуеться на выходе для всех фильмов получить информацию вида:
Имя Фильма1 / Жанр1, Жанр2, ... / Актёр1, Акрёт2, Актёр3 ... /
Имя Фильма2 / Жанр1, Жанр2, ... / Актёр1, Акрёт2, Актёр3 ... /
Как я понимаю связал я всё правильно, т.к. у фильма может быть много жанров, и один и тот же жанр может быть у многих фильмов, тоже самое и с актёрами.
Только вот как выбрать это более оптимально?
Для моего примера легко получить таблицу вида:
Имя фильма / Жарн / Имя актёра
Имя Фильма 1 / Жанр1 / Актёр1
Имя фильма 1 / Жанр1 / Актёр2
Имя фильма 1 / Жанр2 / Актёр1
Имя фильма 1 / Жанр2 / Актёр2
Имя фильма 2 / Жанр1 / Актёр1
и тд...
И ещё.. Возмножно ли получить на выходе требуемый результат одинм запросом или двумя тремя? Так как если список будет состоять из 100 или даже 1000 фильмов, чтобы извлечь такую информацию потребуеться 100х2+1 или 1000х2+1 запросов.
Пока я временно делаю это тремя запросами: выбираю всех актёров, выбираю все жанры, выбираю все фильмы. И уже на php пишу код который сопостовляет (работает быстрее чем 1000х2+1 запрос).
Вопщем кто что думает по этому поводу, очень важно ваще мнение, примеры тоже будут кстати..
-~{}~ 18.10.05 00:59:
Пока вот что смог придумать: (Кто что может по этому поводу сказать? )
Код:
<?
$result=mysql_query("SELECT f.id as film_id, f.name as film_name,
a.id as actor_id, a.name as actor_name,
g.id as genre_id, g.name as genre_name
FROM films f, actors a, genres g,
films_genres fg, films_actors fa
WHERE fa.f_id=f.id AND fa.a_id=a.id AND
fg.f_id=f.id AND fg.g_id=g.id
ORDER BY a.name, g.name;");
while($rows=mysql_fetch_array($result)) {
// При смени фильма
($film[name]<>$rows[film_name]) {
// Если фильм уже прошёл фазу сбора инофрмации,
// значит мы собарли всю информацию о нём
if($film[name]<>'') {
// А потому выводим.. тут может быть много различных методов вывода
// Хотя иногда выгоднее это делать не тут
print "Film name: ".$film[name];
print_r "Genres: ".$film[genres];
print_r "Actors: ".$film[autors];
}
// При смене фильма очистим старые данные и забьём новые
$film[name]=$rows[film_name];
$film[genres]=array();
$film[actors]=array();
};
// Колекционируем жарны текущего фильма
if(!in_array($rows[$genre_name],$film[genres])) {
$film[genres][]=$rows[$genre_name];
};
// Колекционируем аткрёров текущего фильма
if(!in_array($rows[$autor_name],$film[actors])) {
$film[actors][]=$rows[$autor_name];
};
}
?>