Вывод результата сложного запроса

pagal

Новичок
Есть таблицы:

films:
id | title | year | description | time | url

genres:
id | title

actors:
id | name | date

связи по id:

films_genres:
id_film | id_genre

films_actors
id_film | id_actor

Сделала 3 запроса:

PHP:
$films = mysql_query("SELECT 
films.id,
films.title,
films.year,
films.description
FROM films
ORDER BY year DESC LIMIT 6" ,$db);

$actors = mysql_query("SELECT 
actors.name as actor_name
FROM films,actors WHERE 
actors.id in (SELECT id_actor FROM films_actors WHERE id_film=films.id)" ,$db);

$genres = mysql_query("SELECT
genres.title as genre 
FROM films,genres WHERE 
genres.id in (SELECT id_genre FROM films_genres WHERE id_film=films.id)" ,$db);
Данные должны выводиться так:

Название: фильм 1
Жанры: жанр 1, жанр 2
Год: 2007
Актеры: актер 2, актер 4

Если каких то данных нет, предположим актеров, то:

Название: фильм 2
Жанры: жанр 2, жанр 3
Год: 2008
Актеры:

Не могу вывести правильно на страницу, вывожу через mysql_fetch_assoc.
Подскажите пожалуйста как вывести так как надо на страницу и укажите на ошибки пожалуйста, а то мучаюсь сутки уже.
 

pagal

Новичок
PHP:
while ($tables = mysql_fetch_assoc($films)) {
	echo '<div class="normal film">';
	echo '<h1><a href="#">'.$tables['title'].'</a> ('.$tables['year'].')</h1>';
	echo '<img src="images/covers/'.$tables['title'].'.jpg" alt="'.$tables['title'].'"/>';
	echo '<div><b>Актеры:</b><span>';
	echo '<a href="#">ТУТ ДОЛЖнЫ ВЫВОдИТЬСЯ АКТЕРЫ</a>';
	echo '</span><hr /><b>Жанры:</b><span>';
	echo '<a href="#">ТУТ ДОЛЖнЫ ВЫВОдИТЬСЯ ЖАНРЫ</a>';
	echo '</span><hr />';
	echo '<p>'.$tables['description'].'</p>';
	echo '</div></div>';
}
Выводятся фильмы, потому что цикл по $films, но как сделать чтобы выводилась и другая информация, я не знаю. Пробовала еще один цикл внутри этого, но получался бред.
 

prolis

Новичок
Мне никто не подскажет?
Да уже все подсказал. Что бы в одном цикле всю информацию получить, необходимо использовать результат запроса со всеми необходимыми полями.
Такой запрос со всеми полями и по фильму и по актерам приведен в первом ответе.
В него нужно добавить аналогичным образом информацию о жанрах.
Затем сгруппировать по фильму с помощью групповой функции, предоставленной тоже в первом ответе.
 

pagal

Новичок
А что делать если надо связать 3 таблицы? Вот код который делаю я, выдает ошибку.

SELECT *
FROM `films` f,`actors` a, `directors` d
LEFT JOIN `films_actors` fa ON (fa.id_film=a.id)
LEFT JOIN `films_directors` fd ON (fd.id_film=d.id)

Подскажите пожалуйста где ошибка.
 

pagal

Новичок
Через WHERE все выводит правильно, тока не совсем так как надо, тоесть если нет актеров предположим по фильму, то не выведется фильм, а нужно чтоб выводился.

Данные должны выводиться так:

Название: фильм 1
Жанры: жанр 1, жанр 2
Год: 2007
Режиссер: режиссер 1
Актеры: актер 2, актер 4

Если каких то данных нет, предположим актеров, то:

Название: фильм 2
Жанры: жанр 2, жанр 3
Год: 2008
Режиссер: режиссер 4
Актеры:

Что-то типа того нужно.
 

Lirik

Новичок
pagal
[не прочитал тред каюсь] но LEFT JOIN все равно поможет
 

pagal

Новичок
А как связать при помощи LEFT JOIN 2 таблицы которые в свою очередь связываются через таблицу с id. Тоесть,

films:
id | title | year | description | time | url

actors:
id | name | date

films_actors
id_film | id_actor
 

pagal

Новичок
неудачные попытки:

SELECT *
FROM `films` f,`actors` a
LEFT JOIN `films_actors` fa ON (fa.id_film=a.id)

SELECT *
FROM `films` f,films_actors
LEFT JOIN `actors` a ON (films_actors.id_film=a.id)

SELECT f.*,a.*
FROM films f, films_actors fa
LEFT JOIN actors a ON f.id=fa.id_film
and fa.id_actor=a.id
 

Вурдалак

Продвинутый новичок
Зачем ты вообще ставишь «,»? Это аналог JOIN, только приоритет другой.

Код:
FROM films f
LEFT JOIN film_actors fa ON f.id = fa.id_film 
LEFT JOIN actors a ON a.id = fa.id_actor
 

pagal

Новичок
Все получилось, спасибо, запрос в конечном счете получился такой:

SELECT *,
GROUP_CONCAT(DISTINCT a.name ORDER BY a.name ASC SEPARATOR ', ') AS actors,
GROUP_CONCAT(DISTINCT d.name ORDER BY d.name ASC SEPARATOR ', ') AS directors
FROM films f
LEFT JOIN films_actors fa ON f.id = fa.id_film
LEFT JOIN actors a ON a.id = fa.id_actor
LEFT JOIN films_directors fd ON f.id = fd.id_film
LEFT JOIN directors d ON d.id = fd.id_director
GROUP BY f.id
 
Сверху