首页 > 解决方案 > 如何找到 DISTINCT 组合?

问题描述

有3张桌子:

CREATE TABLE Employee(
  EID mediumint PRIMARY KEY AUTO_INCREMENT,
  EName varchar(100) DEFAULT NULL,
  EPincode mediumint unsigned NULL
);

EID 是每个 Employee 的 Employee-Id,它是唯一的;

CREATE TABLE Project(
  PID mediumint PRIMARY KEY AUTO_INCREMENT,
  PName varchar(30) DEFAULT NULL,
  MID mediumint UNIQUE NOT NULL,
  FOREIGN KEY (MID) REFERENCES Employee(EID)
);

MID 是负责项目的员工的经理 ID。

CREATE TABLE Works_On(
  EID mediumint NOT NULL,
  PID mediumint NOT NULL,
  FOREIGN KEY (EID) REFERENCES Employee(EID),
  FOREIGN KEY (PID) REFERENCES Project(PID)
);

此表包含所有员工及其相关项目。

一个员工可以从事多个项目。一个项目可以由多个员工完成。每个项目都有一个经理。经理可以有一名或多名员工在他手下。

我想找到一个由员工姓名、项目名称和经理姓名组成的表。请帮忙。

这是我到目前为止写的查询,但它不起作用:

SELECT DISTINCT A.EName AS "Employee Name"
               ,A.PName AS "Project Name"
               ,B.EName AS "Manager Name" 
FROM (SELECT P.PName
            ,E.EName 
      from Works_On W 
      NATURAL JOIN Project P 
      NATURAL JOIN Employee E) A,
(SELECT E.EName 
 from Project P 
 INNER JOIN Employee E ON P.MID = E.EID) B

标签: mysqldatabase

解决方案


SELECT P.PName AS ProjectName,
       M.EName AS ManagerName, 
       E.EName AS EmployeeName 
FROM Project P 
     LEFT JOIN Employee M ON (P.MID=M.EID) 
     LEFT JOIN Works_On WO on (P.PID=WO.PID) 
     LEFT JOIN Employee E on (E.EID=WO.EID);

有效。


推荐阅读