它看起来像一个直接的连接:
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 | 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 一起使用),您只需确保对数据进行排序,然后打印姓名、电子邮件地址和电话号码在报告的“ID 组之前”部分和“每一行”部分中,您将只处理(打印)角色和部门信息。
将报告格式与数据检索操作分开通常是个好主意;这是一个必要的示例,除非您的 DBMS 具有帮助格式化所选数据的特殊功能。
哦,天哪,这听起来很复杂,而且我不能在 PHP 页面中的 mySQL 数据库上轻松运行?
RVA 的东西——你是对的,那不适合 MySQL 和 PHP。
另一方面,有数以百万计的报告(即为呈现给用户而格式化的查询结果)大致执行此操作。他们的技术术语是' Control-Break Report ',但基本概念并不难。
您保留上次处理的“id”编号的记录 - 您可以将其初始化为 -1 或 0。当当前记录的 id 编号与以前的编号不同时,您有一个新用户,您需要启动一个新用户的一组新输出行并打印姓名、电子邮件地址和电话号码(并更改最后处理的 ID 号)。当当前记录具有相同的 ID 号时,您所要做的就是处理工作角色和部门信息(而不是姓名、电子邮件地址和电话号码)。当 ID 号更改时,会发生“中断”。使用单级控制中断,并不难;如果你有 4 或 5 个级别,你必须做更多的工作,这就是为什么有报告包来处理它的原因。
所以,这并不难——它只需要一点点小心。