[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Таблицы в БД -> связь один ко многим -> результат - многомерный масив
anavrin
Здравствуйте опытные и знающие.
Имеем MySQL и таблицы с отношениями один ко многим.
Уже давненько мучаюсь вопросом об создании многомерного массива после выборки даных из БД.
Массив должен быть примерно следующий:
array (
0 => array (
name => John
surname => Jones
position => Manager
telephone => Array (
0 => 342134123423
1 => 324123412344
)
)
1 => array (
.
.
.)
)

Гугл мне дал не плохое решение http://www.sitepoint.com/forums/showthread.php?t=487087
НО там используется MySQL функция GROUP_CONCAT. Если надо будет юзать PostgreSQL или другую БД - такой метод не подойдет.
Вариант: выборка нужных сотрудников, потом для каждого сотрудника отдельным SQL запросом извлекать его телефоны - не предлагать .
Вариант: Объектно-реляционная проекция http://ru.wikipedia.org/wiki/ORM - не предлагать.

Можно использовать Join, тогда результирующая таблица будет примерно следующей:
[id] [name] [surname] [position] [employee_id] [telephone]
0 John Jones Manager 0 342134123423
0 John Jones Manager 0 312443563456
1 Mike Mikes Journalist 1 872323452334
1 Mike Mikes Journalist 1 345123452345
.
.
.
Потом через цикл анализируем и делаем нужный многомерный массив.
А представим что надо еще одновременно выбрать, из другой таблицы, список Email-лов сотрудника.... Наверно, такая результирующая таблица анализу не подлежит.

В условиях что сотрудников несколько миллионов, поделитесь универсальной рецептурой уважаемые.
Спасибо.



Спустя 18 минут, 52 секунды (1.06.2008 - 17:00) Ghost написал(а):
ну в во-первых в постгре уже организованно нормальное хранение массивов, так что если есть выбор бд - может сразу с ней начать работу.
во-вторых, есть ф-ция serialize, если не планируется поиска по телефону - вполне можно заюзать её. если же поиск всё-же будет - лучше банальный CONCAT или CONCAT_WS через запятую, точку запятой, или любой другой разделитель

Спустя 1 час, 8 минут, 10 секунд (1.06.2008 - 18:08) anavrin написал(а):
Всетаки вопрос касается формирования многомерного массива, который повторярет даные таблиц и их взаимосвязи.

Спустя 3 часа, 13 минут, 25 секунд (1.06.2008 - 21:22) Ghost написал(а):
тогда я не понимаю в чём именно затруднение

Спустя 6 дней, 22 часа, 7 минут, 25 секунд (8.06.2008 - 19:29) sergeiss написал(а):
А я как раз не понял, что тут непонятного smile.gif

Делаем БД, состоящую из следующих таблиц:
names - поля id и любые другие с описанием общих данных о человеке
phones - поля id и номер телефона, можно также добавить тип телефона
mails - поля id и mail, можно добавить дополнительное описание почты

Выборка всех телефонов:
select * from names n, phones p where n.id=p.id

Выборка всех мэйлов:
select * from names n, mails m where m.id=n.id

И в том, и в другом случае результат - таблица искомого вида, т.е. сначала идет описание человека, потом его телефоны (в первом случае) или мэйлы (во втором случае).

Естественно, лучше вместо * указать нужные колонки... Это, я думаю, и так понятно. Но на всякий случай укажу, что запрос примет примерно такой вид:
select n.name, n.sername, p.phone from names n, phones p where n.id=p.id
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.