Это выглядит как прямое соединение:
SELECT p.*, j.*
FROM People AS p INNER JOIN Roles AS r ON p.id = r.person_id
ORDER BY p.name;
Оставшаяся часть работы — форматирование; это лучше всего сделать с помощью пакета отчетов.
Спасибо за быстрый ответ, это кажется хорошим началом, но вы получаете несколько строк на человека, например (вы должны представить, что это таблица, поскольку вы, похоже, не можете форматировать комментарии):
id | Name | email_address | phone_number | job_role | department
1 | paul | [email protected] | 123456 | secretary | HR
1 | paul | [email protected] | 123456 | assistant | media
2 | bob | [email protected] | 567891 | manager | IT
Я бы хотел, чтобы в идеале по одной строке на человека со всеми их рабочими ролями, если это возможно?
Это зависит от вашей СУБД, но большинство доступных не поддерживают RVA — атрибуты, значимые для отношений. Вам бы хотелось, чтобы роль работы и отдел были частью результата, как таблица, связанная с пользователем:
+----+------+------------------+--------------+------------------------+
| id | Name | email_address | phone_number | dept_role |
+----+------+------------------+--------------+------------------------+
| | | | | +--------------------+ |
| | | | | | job_role | dept | |
| 1 | paul | [email protected] | 123456 | | secretary | HR | |
| | | | | | assistant | media | |
| | | | | +--------------------+ |
+----+------+------------------+--------------+------------------------+
| | | | | +--------------------+ |
| | | | | | job_role | dept | |
| 2 | bob | [email protected] | 567891 | | manager | IT | |
| | | | | +--------------------+ |
+----+------+------------------+--------------+------------------------+
Это точно представляет нужную информацию, но обычно это не вариант.
Итак, что произойдет дальше, зависит от вашего инструмента генерации отчетов. Используя тот, с которым я больше всего знаком (Informix ACE, часть Informix SQL, доступный от IBM для использования с СУБД Informix), вы просто убедитесь, что данные отсортированы, а затем напечатаете имя, адрес электронной почты и номер телефона. в разделе «ДО ГРУППА id» отчета, а в разделе «НА КАЖДОЙ СТРОКЕ» вы будете обрабатывать (печатать) только информацию о роли и отделе.
Часто рекомендуется отделить форматирование отчета от операций извлечения данных; это пример того, где это необходимо, если ваша СУБД не имеет необычных функций, помогающих форматировать выбранные данные.
О боже, это звучит очень сложно, и это не то, что я мог бы легко запустить в базе данных mySQL на странице PHP?
Материал RVA - вы правы, это не для MySQL и PHP.
С другой стороны, существуют миллионы отчетов (имеются в виду результаты запросов, отформатированные для представления пользователю), которые примерно так и делают. Технический термин для них — Отчет Control-Break. основная идея не сложная.
Вы сохраняете запись номера 'id', который вы в последний раз обрабатывали - вы можете инициализировать его значением -1 или 0. Когда текущая запись имеет номер id, отличный от предыдущего номера, тогда у вас есть новый пользователь, и вам нужно начать новый набор выходных строк для нового пользователя и печать имени, адреса электронной почты и номера телефона (и изменение последнего обработанного идентификационного номера). Когда текущая запись имеет тот же идентификационный номер, все, что вы делаете, — это обрабатываете информацию о должности и отделе (а не имя, адрес электронной почты и номер телефона). «Перерыв» происходит при изменении идентификационного номера. С одним уровнем контроля-брейка это не сложно; если у вас 4 или 5 уровней, вам нужно проделать больше работы, поэтому для этого существуют пакеты отчетов.
Так что это не сложно - просто нужно немного осторожности.
person
Jonathan Leffler
schedule
23.06.2010