我正在为公司的新系统创建数据库结构。我们基于Web的应用程序将多个内部应用程序链接在一起。
在我们的数据库中,我有一个HR模式,其中包含一系列表格,用于存储我们公司所有员工的数据。但是,我们还将有另外两家公司可以访问我们的系统。
现在在员工架构中,我有以下几个表:
employees (houses name, address, etc)
phone_manager (houses multiple phone numbers for each employee, mobile, home, etc.)
email_manager (again multiple emails per employee)
其中,但这些是主要的包含表格。
对于其他公司,只有一张桌子,这张桌子上有每个员工的姓名,电话号码,电子邮件和公司。
我的主要问题是如何在这些表和我的用户表之间建立关系,以便能够枚举所有不同用户的所有有用信息?
包含所有用户的数据表的输出示例
╔═════════════╦══════════════╦═══════════════╦══════════════╦══════════════╗
║ Name ║ Work Number ║ Mobile Number ║ Email 1 ║ Email 2 ║
╠═════════════╬══════════════╬═══════════════╬══════════════╬══════════════╣
║ John Doe ║ 111-555-0123 ║ 123-456-7890 ║ j.d@hp.com ║ johnd@hp.com ║
║ Jane Doe ║ 121-545-0123 ║ ║ janed@hp.com ║ ║
║ Michael Joe ║ ║ 123-987-4567 ║ ║ mj@cc.net ║
╚═════════════╩══════════════╩═══════════════╩══════════════╩══════════════╝
还有一个公司专栏,该专栏来自一个名为organization的表。
答案 0 :(得分:1)
您应该在Employees表中有一个键,可以唯一地标识员工,如自动递增号码或您选择的任何其他号码。
如果需要,您可以在其他表格中使用该EmpID,例如电话管理员/电子邮件管理器。
请记住,经理也是一名员工,因此经理ID也只能从员工表中派生出来,您不需要为此创建任何新员工。
快速浏览一下冒险作品数据库,这可以让您更深入地了解这一点。
答案 1 :(得分:0)
像这样使用LEFT JOIN
:
SELECT employees.Name,
phone_manager.Work_Number AS 'Work Number',
phone_manager.Mobile_Number AS 'Mobile Number',
email_manager.Email_1 AS 'Email 1',
email_manager.Email_2 AS 'Email 2'
FROM employees
LEFT JOIN phone_manager ON phone_manager.employee_id = employees.id
LEFT JOIN email_manager ON email_manager.employee_id = employees.id
编辑要回答评论中的问题,请在查询末尾添加以下条件:
WHERE employees.id IN(SELECT users.employee_id FROM users
WHERE users.company_id IN(1, 2))
或者,您可以使用INNER JOIN
添加users表:
SELECT employees.Name,
phone_manager.Work_Number AS 'Work Number',
phone_manager.Mobile_Number AS 'Mobile Number',
email_manager.Email_1 AS 'Email 1',
email_manager.Email_2 AS 'Email 2'
FROM employees
INNER JOIN users ON users.employee_id = employees.id AND users.company_id IN(1, 2)
LEFT JOIN phone_manager ON phone_manager.employee_id = employees.id
LEFT JOIN email_manager ON email_manager.employee_id = employees.id