найти сотрудников, которые не занимаются спортом MYSQL - PullRequest
0 голосов
/ 17 марта 2020

Предположим, у меня есть таблица сотрудников в одной MYSQL таблице

| CompanyId, EmployeeId, Employee Name |

А в другой таблице у меня есть сотрудники и спорт

| CompanyId, Employee Id, Sport |

Так что теперь я хочу найти имена сотрудников всех людей в компании, которые не занимаются каким-либо спортом (скажем, футболом)

Предположим, я создал представление для упрощения запросов:

Вид слева присоединяйтесь, где companyId и employeeId совпадают, так что мое представление выглядит следующим образом: `` `

| CompanyId, EmployeeId, Employee Name, Sport |

, где строки дублируются для каждого вида спорта, например

 01 | 017 | Dylan | Football
 01 | 017 | Dylan | Cricket
 01 | 017 | Dylan | Table Tennis
 01 | 007 | Tom   | Hockey
 01 | 007 | Tom   | Table Tennis
 01 | 011 | Mary  | null

например, выведите меня всех игроков из Компания 01, которая не играет в хоккей, должна вернуть Дилана и Мэри

Я пробовал SELECT DISTINCT для представления, но это убивает производительность даже для небольших наборов данных sh (порядок в 1000 строк занимает несколько секунд) , Предположим, что индекс в столбце id в левой таблице используется в объединении (CompanyId, EmployeeId).

Ответы [ 3 ]

0 голосов
/ 17 марта 2020

Вы можете попробовать not exists:

select e.* from employees e
where e.companyid = '01' 
and not exists (
  select 1 from sports s
  where s.companyid = e.ecompanyid and s.employeeid = e.employeeid and s.sport = 'football'
)

или с левым соединением employees до отфильтрованного результата sports, который вернет все несопоставленные строки:

select e.* 
from employees e left join (
  select * from sports
  where sport = 'football'
) s on s.companyid = e.companyid and s.employeeid = e.employeeid
where e.company = '01' and s.employeeid is null
0 голосов
/ 17 марта 2020

NOT IN также возможно здесь.

SELECT e.name FROM employees e WHERE e.company = '01' AND e.employeeid NOT IN (
SELECT s.employeeid FROM sports s WHERE s.sport = 'football'
);
0 голосов
/ 17 марта 2020

not exists приходит на ум:

select e.*
from employees e
where not exists (select 1
                  from sports s
                  where s.employeeid = e.employeeid and s.sport = 'football'
                 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...