Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Выборка данных с множеством отношений (реляций) (nancho)
Author Message
nancho
Guest





Карма: 388
   поощрить/наказать


PostPosted: Mon Apr 16, 2007 9:46 pm (написано за 10 минут 17 секунд)
   Post subject: Выборка данных с множеством отношений (реляций)
Reply with quote

Помогите мне, пожалуйста, решить сложный, по моему мнению, вопрос.

Есть таблица с актёрами (id - auto_increment, и name - имя актёра).
Так же есть таблица с фильмами (id - auto_increment, title - название фильма).
И есть таблица с отношениями актёров к фильмам (mid - id фильма и aid - id актёра).

У одного фильма не один актёр. Как правильнее получать информацию из базы? Одним ли запросом:
Code (SQL): скопировать код в буфер обмена
SELECT * FROM фильмы, актёры, отношение_фильмов_и_актёров
WHERE фильмы.id = отношение_фильмов_и_актёров.mid AND актёры.id = отношение_фильмов_и_актёров.aid
Но тогда записи дублируются и получается далко не то, что надо.
Одним ли запросом с group_concat:
Code (SQL): скопировать код в буфер обмена
SELECT фильмы.*, group_concat(актёры.name separator '|') AS aname FROM фильмы, актёры, отношение_фильмов_и_актёров
WHERE фильмы.id = отношение_фильмов_и_актёров.mid AND актёры.id = отношение_фильмов_и_актёров.aid
GROUP BY 1
Но потом придётся разбивать explode('|', $row['aname']). Но хочется заменить aname массивом нормальным с содержанием всех используемых id и name актёров.

Скажите, пожалуйста, как же лучше? Может двумя запросами? А если я сделаю ещё и жанры, например, то получится три запрса на каждый фильм?
Back to top
nancho
Guest





Карма: 388
   поощрить/наказать


PostPosted: Tue Apr 17, 2007 4:20 am (спустя 6 часов 33 минуты; написано за 5 минут 10 секунд)
   Post subject:
Reply with quote

Я уточню.

При первом варианте мы получим что-то типа (не учитывая полей из таблицы с отношениями):
Code (php): скопировать код в буфер обмена
array (www.php.net/array)(
0 => array (www.php.net/array)(
'фильмы.id' => 1,
'фильмы.name' => 'Anther stupid movie',
'актёр.id' => 1,
'актёр.name' => 'Василий Васильевич Пупкин'
),
1 => array (www.php.net/array)(
'фильмы.id' => 1,
'фильмы.name' => 'Anther stupid movie',
'актёр.id' => 2,
'актёр.name' => 'Брэд Инокентиевич Питт'
)
);
Второй вариан:
Code (php): скопировать код в буфер обмена
array (www.php.net/array)(
0 => array (www.php.net/array)(
'.id' => 1,
'.name' => 'Anther stupid movie',
'.name' => '  |  '
)
);
А хочется:
Code (php): скопировать код в буфер обмена
array (www.php.net/array)(
0 => array (www.php.net/array)(
'фильмы.id' => 1,
'фильмы.name' => 'Anther stupid movie',
'актёр' => array (www.php.net/array)(
0 => array (www.php.net/array)(
'id' => 1
'name' => 'Василий Васильевич Пупкин'
),
1 => array (www.php.net/array)(
'id' => 2
'name' => 'Брэд Инокентиевич Питт'
)
)
)
);
Back to top
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9986
   поощрить/наказать


PostPosted: Wed Apr 18, 2007 2:18 pm (спустя 1 день 9 часов 57 минут; написано за 3 минуты 25 секунд)
   Post subject:
Reply with quote

Смотрите в сторону JOIN'ов.

В принципе, задача решается элементарно, но мне сейчас, честно говоря, влом показывать решение.
(У меня ещё и комп в «пятницу, тринадцатого» сломался — даже проверить решение не смогу...)
Back to top
View user's profile Send private message
nancho
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Apr 19, 2007 2:19 am (спустя 12 часов 1 минуту; написано за 1 минуту 16 секунд)
   Post subject:
Reply with quote

В джоинах я тоже дальше group_concat уйти не смог.

Не проверяй запрос, дай хотя бы примерный код. Я логику хочу понять. Довести запрос до ума смогу. По крайней мере буду знать куда копать :).
Back to top
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9986
   поощрить/наказать


PostPosted: Thu Apr 19, 2007 4:19 am (спустя 2 часа 5 секунд; написано за 1 минуту 48 секунд)
   Post subject:
Reply with quote

nancho wrote:
Не проверяй запрос, дай хотя бы примерный код.
Когда это мы с Вами «на ты» перешли?

forum.dklab.ru/about/todo/PravilaEtogoForuma-ProchitayteObyazatelno.html

По поводу кода: просто добавить "GROUP BY фильмы.name" в первый запрос не пробовали?
Back to top
View user's profile Send private message
Владимир Хоменко
Участник форума



Joined: 11 Jun 2004
Posts: 427
Карма: 42
   поощрить/наказать

Location: Николаев, Украина

PostPosted: Thu Apr 19, 2007 12:07 pm (спустя 7 часов 47 минут; написано за 3 минуты 8 секунд)
   Post subject:
Reply with quote

bæv
И что это даст? Вы уверены, что поняли чего хочет автор?

nancho
То, что Вы хотите, нельзя реальзовать средствами только SQL, ИМХО, так как функции для работы с SQL возвращают одномерные массивы, Вы же хотите многомерные. Ваша задача решается с помощью PHP, и решается довольно просто.
Back to top
View user's profile Send private message Send e-mail
nancho
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Apr 19, 2007 10:16 pm (спустя 10 часов 9 минут; написано за 13 минут 35 секунд)
   Post subject:
Reply with quote

Quote:
Когда это мы с Вами «на ты» перешли?
Прошу прощения.

Странное правило потому что противоречит правилам русского языка, но я никогда не был большим его поклонником. :)

Владимир Хоменко, я переформулирую вопрос :). Объеденить массивы с помощью php я смогу. Но первым делом интересует вопрос: как сделать запросы к базе. Одним махом или для каждой таблицы (не считая отношений) - свой запрос. Сначала берём фильмы, потом актёром (и в where учитываем id полученые из запроса к фильмам)? Смущает только, что если будет таблица с жанрами и их отношениями к фильмам, то придётся делать ещё запрос. Насколько так правильно и правильна ли моя логика?
Back to top
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML