2011-02-28 66 views
1

我不是一个数据库专家,所以请随时让我知道我完全错了。我试图创建一套具有以下基本规则的表格:数据库纲要和提取信息

有公司,经理和员工。经理只能属于一个公司,但员工可以属于多个经理。我提出的表结构是这样的:

# Companies 
    company_id 
    company_name 

# Managers 
    manager_id 
    company_id 

# Employees 
    employee_id 
    company_id 
    employee_name 

# Managed By 
    employee_id 
    manager_id 

这个结构看起来是否合理?我认为我需要像“托管”这样的东西,因为员工可以有多个经理。

我现在很惊讶的是现在我该如何设法抓取我想要的记录。例如:

  • 获取属于某个经理
  • 获取属于两个特定经理
  • 所有员工在同一公司

编辑所有员工姓名所有员工姓名:我认为我得到了这些查询,但仍然感到不自在,所以对表结构的任何帮助将不胜感激。

事实上,我在为这些信息编写查询时遇到问题,这让我觉得我在表结构上做了一些根本性的错误。希望这里的某个人能帮我解决问题吗?

回答

2

一般来说,该方案是正确的。然而,确实存在的一种可能性是,您可以获得由两家以上公司的经理管理员工的数据。

对于您的疑问:

select distinct Employees.employee_name as name from Employees, Managers, ManagedBy where Managers.manager_id = X and ManagedBy.manager_id = Managers.manager_id and Employees.employee_id = ManagedBy.employee_id; 

select distinct Employees.employee_name as name from Employees, Managers, ManagedBy where (Managers.manager_id = X or Managers.manager_id = Y) and ManagedBy.manager_id = Managers.manager_id and Employees.employee_id = ManagedBy.employee_id; 

,其中X和Y是你想要的经理的ID。

编辑:我知道你划掉你想要的查询,但第三个是这样的:

select distinct Employees.employee_name as name from Employees where Employees.company_id = Z; 

其中Z是你想要的公司标识。

1

所有员工在同一公司

SELECT employee_id, employee_name, company_name 
FROM Employees 
LEFT JOIN Companies ON Employees.company_id = Companies.company_id 
WHERE Companies.company_id = ???? 
or if you pulling by name 
WHERE Companies.company_name = 'ABC' 

获取属于某个经理的所有雇员的姓名

SELECT employee_id, employee_name, manager_id 
FROM Employees 
LEFT JOIN Managed_By ON Employees.employee_id = Managed_By.employee_id 
WHERE Managed_By.manager_id = ???? 

MANAGER_NAME在管理表将是不错的