СЛЕДУЕТ ПРИСОЕДИНИТЬСЯ к четырем таблицам с нежелательным результатом - PullRequest
0 голосов
/ 08 января 2019

Я сделал небольшого менеджера проектов. Мне нужно знать, сколько открытых проектов назначено пользователям определенной группы пользователей.

Я создал четыре таблицы:

Пользователи

╔════╦══════════╦══════════════╗
║ id ║ group_id ║ full_name    ║
╠════╬══════════╬══════════════╣
║  1 ║     4    ║ Jescie Head  ║
╠════╬══════════╬══════════════╣
║  2 ║     1    ║ Amity Mooney ║
╠════╬══════════╬══════════════╣
║  3 ║     1    ║ Ivy Yates    ║
╠════╬══════════╬══════════════╣
║  4 ║     1    ║ Bo Goff      ║
╚════╩══════════╩══════════════╝

Проекты

╔════╦══════╦════════╗
║ id ║ code ║ status ║
╠════╬══════╬════════╣
║  1 ║ P001 ║    0   ║
╠════╬══════╬════════╣
║  2 ║ P002 ║    1   ║
╚════╩══════╩════════╝

группа

╔════╦══════╦═════════╦════════╗
║ id ║ type ║ name    ║ status ║
╠════╬══════╬═════════╬════════╣
║  1 ║   0  ║ Group 1 ║    1   ║
╠════╬══════╬═════════╬════════╣
║  2 ║   2  ║ Group 2 ║    1   ║
╠════╬══════╬═════════╬════════╣
║  4 ║   1  ║ Group 4 ║    1   ║
╚════╩══════╩═════════╩════════╝

project_user

╔═════════╦════════════╗
║ id_user ║ id_project ║
╠═════════╬════════════╣
║    5    ║      2     ║
╠═════════╬════════════╣
║    4    ║      2     ║
╠═════════╬════════════╣
║    3    ║      2     ║
╠═════════╬════════════╣
║    4    ║      1     ║
╚═════════╩════════════╝

Я хочу выяснить, сколько активных проектов назначено пользователю группы 1 (тип 0). Мой запрос работает, показывает нужных пользователей, но учитывает также проект со статусом 0:

SELECT u.id, 
       u.full_name, 
       u.type, 
       Count(pu.id_project) AS assigned_projects 
FROM   users AS u 
       LEFT JOIN project_user AS pu 
              ON u.id = pu.id_user 
       JOIN groups AS g 
         ON g.id = u.group_id 
            AND g.type = 0 
       LEFT JOIN projects AS p 
              ON pu.id_project = p.id 
                 AND p.status = 1 
GROUP  BY u.id 
ORDER  BY u.type, u.id ASC 

UPDATE

Текущий результат:

╔════╦══════════════╦══════╦═══════════════════╗
║ id ║   full_name  ║ type ║ assigned_projects ║
╠════╬══════════════╬══════╬═══════════════════╣
║  2 ║ Amity Mooney ║   3  ║         0         ║
╠════╬══════════════╬══════╬═══════════════════╣
║  3 ║   Ivy Yates  ║   6  ║         1         ║
╠════╬══════════════╬══════╬═══════════════════╣
║  4 ║    Bo Goff   ║   1  ║         2         ║
╚════╩══════════════╩══════╩═══════════════════╝

Требуемый результат: Причина: проект 2 закрыт.

╔════╦══════════════╦══════╦═══════════════════╗
║ id ║   full_name  ║ type ║ assigned_projects ║
╠════╬══════════════╬══════╬═══════════════════╣
║  2 ║ Amity Mooney ║   3  ║         0         ║
╠════╬══════════════╬══════╬═══════════════════╣
║  3 ║   Ivy Yates  ║   6  ║         0         ║
╠════╬══════════════╬══════╬═══════════════════╣
║  4 ║    Bo Goff   ║   1  ║         1         ║
╚════╩══════════════╩══════╩═══════════════════╝

DB Fiddle: DB Fiddle

1 Ответ

0 голосов
/ 08 января 2019

Я думаю, что вы не должны использовать левое соединение при соединении таблицы "проекты". Кроме того, ваша группа построчно должна быть исправлена. Пожалуйста, попробуйте запрос ниже.

SELECT u.id,u.full_name,u.type,Count(pu.id_project) AS assigned_projects 
FROM users AS u 
JOIN groups AS g ON g.id = u.group_id AND g.type = 0 
LEFT JOIN project_user AS pu ON u.id = pu.id_user 
JOIN projects AS p ON pu.id_project = p.id AND p.status = 1 
GROUP BY u.id,u.full_name,u.type
ORDER  BY u.type, u.id ASC 

РЕДАКТИРОВАТЬ: Если вы хотите видеть всех пользователей, даже если для этого пользователя нет назначенного активного проекта, вам нужно использовать ниже (Сумма с case-when вместо COUNT и удалить проверку статуса в строке соединения):

SELECT u.id,u.full_name,u.type,SUM(CASE WHEN p.status = 1 then 1 else 0 end) AS assigned_projects 
FROM users AS u 
JOIN groups AS g ON g.id = u.group_id AND g.type = 0 
LEFT JOIN project_user AS pu ON u.id = pu.id_user 
JOIN projects AS p ON pu.id_project = p.id
GROUP BY u.id,u.full_name,u.type
ORDER  BY u.type, u.id ASC 

РЕДАКТИРОВАТЬ 2: Вот пример данных, подготовленных в MSSQL. Вам нужно будет удалить # символов для MySQL.

create table #users (id int, groupid int, fullname varchar(50))
create table #groups (id int, [type] int, name varchar(50),[status] bit)
create table #projects (id int, code varchar(50), [status] bit)
create table #project_user (id_user int , id_project int)

insert into #users values (1,4,'Jescie'),(2,1,'Amity'),(3,1,'Ivy'),(4,1,'Jesse')
insert into #projects values (1,'p001',0),(2,'p002',1)
insert into #groups values (1,0,'G1',1),(2,2,'G2',1),(4,1,'G4',1)
insert into #project_user values (5,2),(4,2),(3,2),(4,1)

SELECT u.id,u.fullname,g.[type], SUM(CASE WHEN p.status = 1 then 1 else 0 end) AS assigned_projects 
FROM #users AS u 
JOIN #groups AS g ON g.id = u.groupid AND g.type = 0 
LEFT JOIN #project_user AS pu ON u.id = pu.id_user 
LEFT JOIN #projects AS p ON pu.id_project = p.id 
GROUP BY u.id,u.fullname,g.[type]
ORDER  BY g.[type], u.id ASC 

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...