DROP TABLE IF EXISTS employees;
CREATE TABLE employees (employee_id SERIAL PRIMARY KEY);
DROP TABLE IF EXISTS employee_project;
CREATE TABLE employee_project (employee_id INT NOT NULL, project_id INT NOT NULL,PRIMARY KEY(employee_id,project_id));
DROP TABLE IF EXISTS projects;
CREATE TABLE projects(project_id SERIAL PRIMARY KEY, department_id INT NOT NULL);
INSERT INTO employees VALUES (101),(102),(103);
INSERT INTO employee_project VALUES (101,5004),(101,5005),(101,5006),(101,5007),(102,5004),(102,5007),(102,5008),(103,5006),(103,5007),(103,5008);
INSERT INTO projects VALUES (5004,1),(5005,2),(5006,5),(5007,5),(5008,4),(5009,3);
Consider the following:
SELECT *
FROM employees e
JOIN projects p
LEFT
JOIN employee_project ep
ON ep.employee_id = e.employee_id
AND ep.project_id = p.project_id
WHERE p.department_id = 5;
+-------------+------------+---------------+-------------+------------+
| employee_id | project_id | department_id | employee_id | project_id |
+-------------+------------+---------------+-------------+------------+
| 101 | 5006 | 5 | 101 | 5006 |
| 102 | 5006 | 5 | NULL | NULL |
| 103 | 5006 | 5 | 103 | 5006 |
| 101 | 5007 | 5 | 101 | 5007 |
| 102 | 5007 | 5 | 102 | 5007 |
| 103 | 5007 | 5 | 103 | 5007 |
+-------------+------------+---------------+-------------+------------+
Из этого результата мы можем сделать два наблюдения, каждое из которых может оказаться полезным для решения проблемы.
- Количество отдельных проектов в результате равно количеству отдельных проектов, перечисленных вместе с пользователями 101 и 103 (то есть, сколько раз эти числа появляются в столбце 4).
- Пользователь 102 имеет нулевой результат, что означает, что он не участвует во всех проектах этого отдела.