Как найти DISTINCT комбинаций?

0

Есть 3 таблицы:

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

EID - это идентификатор сотрудника каждого сотрудника, который является уникальным;

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 - это идентификатор менеджера сотрудника, который возглавляет проект.

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
  • 0
    Не могли бы вы показать, что вы пытались до сих пор?
  • 1
    где находится поле имени менеджера?
Показать ещё 4 комментария
Теги:
database

3 ответа

0
Лучший ответ
select A.Employee_name,
       A.project_name,
       B.manager_name  from
      (
        SELECT
        P.PName AS project_name,
        E.EName AS Employee_name,
        E.EID,P.PID
        FROM Works_On W
        INNER JOIN Project P ON W.PID = P.PID
        INNER JOIN Employee E ON W.EID = E.EID

        ) as A           

       left join
       (

        SELECT
        E.EName AS manager_name,
        E.EID,P.PID
        FROM Project P
        INNER JOIN Employee E ON P.MID = E.EID

        ) B on A.PID=B.PID
  • 0
    { "error" : { "code" : "ER_BAD_FIELD_ERROR", "errno" : 1054, "sqlMessage" : "Неизвестный столбец 'E.EID' в 'предложении'", "sqlState" : "42S22"}}
  • 0
    @AniketKumar я отредактировал, что в запросе на соединение пропущено небольшое имя столбца
Показать ещё 7 комментариев
0
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);

Это сработало.

  • 0
    хахахах, ты сказал, что это сработало, и в результате получил ответ :)
  • 0
    LOL, я нашел ответ раньше, чем ты. Еще я благодарен вам за помощь
Показать ещё 1 комментарий
0

Вы можете попробовать выполнить запрос -

SELECT
    E.EName,
    P.PName,
    M.EName
FROM Employee E 
    INNER JOIN Employee M ON M.EID = E.EID
    INNER JOIN Project P ON E.EID = P.MID
    INNER JOIN Works_On W ON W.EID = E.EID AND W.PID = P.PID

Это может вам помочь.

  • 0
    Это не сработало. Неверный вывод. В результате присутствуют только столбцы EName и PName. Когда я сделал псевдонимы, все 3 столбца были видны.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню