Имеем 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 через запятую, точку запятой, или любой другой разделитель
во-вторых, есть ф-ция 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 написал(а):
А я как раз не понял, что тут непонятного 
Делаем БД, состоящую из следующих таблиц:
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

Делаем БД, состоящую из следующих таблиц:
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