Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Вывод результата сложного запроса
Форумы портала PHP.SU » » Работа с СУБД » Вывод результата сложного запроса

Страниц (1): [1]
 

1. EnerdzaiseR - 11 Сентября, 2011 - 10:48:29 - перейти к сообщению
Есть таблицы:

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:
скопировать код в буфер обмена
  1.  
  2. $films = mysql_query("SELECT
  3. films.id,
  4. films.title,
  5. films.year,
  6. films.description
  7. FROM films
  8. ORDER BY year DESC LIMIT 6" ,$db);
  9.  
  10. $actors = mysql_query("SELECT
  11. actors.name as actor_name
  12. FROM films,actors WHERE
  13. actors.id in (SELECT id_actor FROM films_actors WHERE id_film=films.id)" ,$db);
  14.  
  15. $genres = mysql_query("SELECT
  16. genres.title as genre
  17. FROM films,genres WHERE
  18. genres.id in (SELECT id_genre FROM films_genres WHERE id_film=films.id)" ,$db);
  19.  


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

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

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

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

Помогите пожалуйста составить вывод на страницу, так как должно выводиться.
2. DeepVarvar - 11 Сентября, 2011 - 12:29:25 - перейти к сообщению
Я вижу там есть четвертая таблица "films_genres", и это тоже важно.
Структура у вас хреновая, стоит переделать.
Все что вы делаете, можно выбрать одним запросом.
3. White - 11 Сентября, 2011 - 14:28:11 - перейти к сообщению
EnerdzaiseR что-то структура немного знакомая... интересно что по этому поводу скажет тов. Viper
по-факту все-это делается одним запросом с помощью LEFT JOIN и GROUP_CONCAT
DeepVarvar пишет:
Структура у вас хреновая, стоит переделать.

как раз структура здесь довольно неплохая, лично я другую не вижу.
4. EnerdzaiseR - 12 Сентября, 2011 - 22:13:55 - перейти к сообщению
Если делать одним запросом, то если предположим нет актеров к фильму, то не выведется весь фильм.
5. EnerdzaiseR - 17 Сентября, 2011 - 04:44:42 - перейти к сообщению
А как связать при помощи LEFT JOIN 2 таблицы которые в свою очередь связываются через таблицу с id. Тоесть,

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

actors:
id | name | date

films_actors
id_film | id_actor

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

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
6. White - 17 Сентября, 2011 - 09:09:00 - перейти к сообщению
EnerdzaiseR
не гарантирую, что ничего не пропустил, но попробуйте так
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `a`.`id`, `a`.`title`, `a`,`year`, `a`.`description`, `a`.`time`, `a`.`url`, GROUP_CONCAT(`c`.`name`) AS actor_names, GROUP_CONCAT(`c`.`date`) AS actor_dates
  2. FROM `films` AS `a`
  3. LEFT JOIN `films_actors` AS `b` ON `a`.`id`=`b`.`id_film`
  4. LEFT JOIN `actors` AS `c` ON `b`.`id_actor`=`c`.`id`
  5. GROUP BY `id`
7. EnerdzaiseR - 18 Сентября, 2011 - 01:14:13 - перейти к сообщению
Все получилось, спасибо, запрос в конечном счете получился такой:

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
8. White - 18 Сентября, 2011 - 09:16:51 - перейти к сообщению
EnerdzaiseR а что здесь дает группировка с DISTINCT?
9. EnerdzaiseR - 18 Сентября, 2011 - 09:22:51 - перейти к сообщению
Это чтобы актеры не повторялись, если без DISTINCT, то получается такого вида:


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

Воть)
10. White - 18 Сентября, 2011 - 09:40:14 - перейти к сообщению
да я догадался, но за счет чего происходит повтор?

 

Powered by ExBB FM 1.0 RC1