Как выполнить групповую конкатенацию в MySql только в том случае, если в столбце конкатата этой группы есть определенное значение / значения - PullRequest
1 голос
/ 30 марта 2019

У меня есть список сотрудников, и один сотрудник может работать во многих отделах.Я хочу получить список всех сотрудников и всех отделов, в которых они работают, только если они работают с deptID 3 и 4.

Я, только если сотрудник работает в отделе 3 или 4, я хочу получить список всехотделы, в которых он работает.

SQL-запрос выглядит примерно так, чтобы получить сотрудников и их рабочий отдел:

SELECT  e.`Emp_ID`,e.`FirstName`,e.`Address`
,GROUP_CONCAT(edd.Dept_id) AS dept_ids
,GROUP_CONCAT(edd.`Dept_Name`) AS dept_names

FROM employee e
INNER JOIN emp_dept_details edd 
ON e.`Emp_ID` = edd.`Emp_ID`
GROUP BY e.`Emp_ID`;

Результат:

"Emp_ID" "FirstName" "Address"  "dept_ids"       "dept_names"
"1"      "emp1"      "abcd"   "3,9,12,13,11" "Eng,ESC,Mech,EEE,MIS"
"2"      "emp2"      "abcd1"     "9,11,13,8"      "Eng,MIS,EEE,CIS"

Так что я нея не хочу, чтобы в записи group_concat присутствовала вторая запись, поскольку deptID 3 или 4 отсутствует.

Где первая запись содержит 3, поэтому мне нужен весь список "3,9,12,13,11" Могу ли я сделать это безвложенность запроса.Мне приходится иметь дело с огромными записями, поэтому вложение замедлит процесс.

Ответы [ 2 ]

1 голос
/ 31 марта 2019

Вы уже сводите необходимую информацию вместе.Вам просто нужно предложение having:

SELECT e.`Emp_ID`, e.`FirstName`, e.`Address`,
      GROUP_CONCAT(edd.Dept_id) AS dept_ids,
      GROUP_CONCAT(edd.`Dept_Name`) AS dept_names
FROM employee e JOIN
     emp_dept_details edd 
     ON e.`Emp_ID` = edd.`Emp_ID`
GROUP BY e.`Emp_ID`
HAVING SUM( edd.Dept_id IN (3, 4) ) > 0;

Предложение HAVING подсчитывает количество раз, когда сотрудник работает в двух отделах.> 0 говорит, что работник входит хотя бы в одного из них.

1 голос
/ 30 марта 2019

Просто используйте exists с подзапросом

SELECT  e.`Emp_ID`,e.`FirstName`,e.`Address`
,GROUP_CONCAT(edd.Dept_id) AS dept_ids
,GROUP_CONCAT(edd.`Dept_Name`) AS dept_names    
  FROM employee e
 INNER JOIN emp_dept_details edd 
    ON e.`Emp_ID` = edd.`Emp_ID`
 WHERE exists ( SELECT 1 
                  FROM emp_dept_details d
                 WHERE d.`Dept_id` in (3,4) 
                   AND d.`Emp_ID` = e.`Emp_ID` ) 
 GROUP BY e.`Emp_ID`,e.`FirstName`,e.`Address`;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...