它看起来像一个直接的连接:
SELECT p.*, j.*
FROM People AS p INNER JOIN Roles AS r ON p.id = r.person_id
ORDER BY p.name;
剩下的工作是格式化;最好通过报告包来完成。
感谢您的快速回复,这似乎是一个好的开始,但您会得到每个人的多行数据(您必须想象这是一个表格,因为您似乎无法在 cmets 中进行格式化):
id | Name | email_address | phone_number | job_role | department
1 | paul | paul@example.com | 123456 | secretary | HR
1 | paul | paul@example.com | 123456 | assistant | media
2 | bob | bob@example.com | 567891 | manager | IT
如果可能的话,我希望每人一排,最好包含他们所有的工作角色?
这取决于您的 DBMS,但大多数可用的不支持 RVA - 关系值属性。您想要的是结果中的工作角色和部门部分,例如与用户关联的表:
+----+------+------------------+--------------+------------------------+
| id | Name | email_address | phone_number | dept_role |
+----+------+------------------+--------------+------------------------+
| | | | | +--------------------+ |
| | | | | | job_role | dept | |
| 1 | paul | paul@example.com | 123456 | | secretary | HR | |
| | | | | | assistant | media | |
| | | | | +--------------------+ |
+----+------+------------------+--------------+------------------------+
| | | | | +--------------------+ |
| | | | | | job_role | dept | |
| 2 | bob | bob@example.com | 567891 | | manager | IT | |
| | | | | +--------------------+ |
+----+------+------------------+--------------+------------------------+
这准确地代表了您想要的信息,但通常不是一个选项。
因此,接下来会发生什么取决于您的报告生成工具。使用我最熟悉的那个(Informix ACE,Informix SQL 的一部分,可从 IBM 与 Informix DBMS 一起使用),您只需确保对数据进行排序,然后打印姓名、电子邮件地址和电话号码在报告的 'BEFORE GROUP OF id' 部分中,以及在 'ON EVERY ROW' 部分中,您将只处理(打印)角色和部门信息。
将报表格式与数据检索操作分开通常是个好主意;这是一个必要的示例,除非您的 DBMS 具有帮助格式化所选数据的特殊功能。
天哪,这听起来很复杂,而且我不能在 PHP 页面中的 mySQL 数据库上轻松运行?
RVA 的东西 - 你是对的,这不适用于 MySQL 和 PHP。
另一方面,有数以百万计的报告(即为呈现给用户而格式化的查询结果)大致执行此操作。他们的技术术语是'Control-Break Report',但基本思想并不难。
您保留上次处理的“id”编号的记录 - 您可以将其初始化为 -1 或 0。
当当前记录的 id 号码与之前的号码不同时,您就有了一个新用户,您需要为新用户启动一组新的输出行并打印姓名、电子邮件地址和电话号码(并更改最后一个已处理的 ID 号)。当当前记录具有相同的 ID 号时,您所要做的就是处理工作角色和部门信息(而不是姓名、电子邮件地址和电话号码)。当 ID 号更改时,会发生“中断”。使用单级控制中断,并不难;如果你有 4 或 5 个级别,你必须做更多的工作,这就是为什么有报告包来处理它的原因。
所以,这并不难 - 只是需要一点小心。