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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Вывод результата сложного запроса

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
EnerdzaiseR
Отправлено: 11 Сентября, 2011 - 10:48:29
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Нояб. 2010  


Помог: 0 раз(а)




Есть таблицы:

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
Актеры:

Помогите пожалуйста составить вывод на страницу, так как должно выводиться.
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Сентября, 2011 - 12:29:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Я вижу там есть четвертая таблица "films_genres", и это тоже важно.
Структура у вас хреновая, стоит переделать.
Все что вы делаете, можно выбрать одним запросом.
 
 Top
White
Отправлено: 11 Сентября, 2011 - 14:28:11
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




EnerdzaiseR что-то структура немного знакомая... интересно что по этому поводу скажет тов. Viper
по-факту все-это делается одним запросом с помощью LEFT JOIN и GROUP_CONCAT
DeepVarvar пишет:
Структура у вас хреновая, стоит переделать.

как раз структура здесь довольно неплохая, лично я другую не вижу.


-----
if(time()>1356048000) die();
 
 Top
EnerdzaiseR
Отправлено: 12 Сентября, 2011 - 22:13:55
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Нояб. 2010  


Помог: 0 раз(а)




Если делать одним запросом, то если предположим нет актеров к фильму, то не выведется весь фильм.
 
 Top
EnerdzaiseR
Отправлено: 17 Сентября, 2011 - 04:44:42
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Нояб. 2010  


Помог: 0 раз(а)




А как связать при помощи 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

(Отредактировано автором: 17 Сентября, 2011 - 05:02:37)

 
 Top
White
Отправлено: 17 Сентября, 2011 - 09:09:00
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




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`


-----
if(time()>1356048000) die();
 
 Top
EnerdzaiseR
Отправлено: 18 Сентября, 2011 - 01:14:13
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Нояб. 2010  


Помог: 0 раз(а)




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

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
 
 Top
White
Отправлено: 18 Сентября, 2011 - 09:16:51
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




EnerdzaiseR а что здесь дает группировка с DISTINCT?


-----
if(time()>1356048000) die();
 
 Top
EnerdzaiseR
Отправлено: 18 Сентября, 2011 - 09:22:51
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Нояб. 2010  


Помог: 0 раз(а)




Это чтобы актеры не повторялись, если без DISTINCT, то получается такого вида:


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

Воть)
 
 Top
White
Отправлено: 18 Сентября, 2011 - 09:40:14
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




да я догадался, но за счет чего происходит повтор?


-----
if(time()>1356048000) die();
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB