Получить сотрудников, у которых есть более одного телефонного номера с помощью MySQL

#mysql #sql

#mysql #sql

Вопрос:

У меня есть две таблицы: одна — сотрудники, а другая — детали. Здесь мне нужен запрос для отображения сотрудников, у которых несколько телефонных номеров.

Таблица сотрудников:

 employee_id   Name         salary
-----------  -------  --------------------
0001           John         100000
0002           Peter        50000
0003           Russel       60000
0004           Bill         60000
0005           Patrick      90000
 

Подробная таблица :

 employee_id   Address         phone
-----------  -------  --------------------
0001           USA         854646542
0002           Germany     656562354
0001           USA         465222333
0004           China       888444444
0005           Canada      012445869
0005           Canada      789875877
0003           Japan       444555807
 

Исходя из этого, мне нужно отобразить сотрудников, у которых более одного телефонного номера, поэтому ожидаемый результат должен быть

 employee_id   Name         phone
-----------  -------  --------------------
0001           John         854646542
0001           John         465222333
0005           Patrick      012445869
0005           Patrick      789875877
 

Запрос, который я пробовал :

 SELECT COUNT(*)
FROM (
  SELECT employee_id, COUNT(*) AS CNT
  FROM details
  GROUP BY employee_id
) AS T
WHERE CNT > 1
 

Комментарии:

1. Также обратите внимание, что нет смысла в обоих details и employees иметь Name . Чтобы получить имя, используйте a JOIN .

2. обновил мой вопрос @Akina

Ответ №1:

 SELECT DISTINCT employee_id, t3.Name, t1.phone
FROM Details t1
JOIN Details t2 USING (employee_id)
JOIN Employee t3 USING (employee_id)
WHERE t1.phone != t2.phone
-- ORDER BY employee_id
 

Комментарии:

1. @Vicky Обновлено в соответствии с выпуском вопроса.

Ответ №2:

При этом используется подзапрос

 SELECT employee_id, Name, phone
FROM details
WHERE employee_id IN (
   SELECT employee_id
   FROM details
   GROUP BY employee_id
   HAVING COUNT(*) > 1
)
 

Я также могу быть написан с использованием объединения:

 SELECT d.employee_id, d.Name, d.phone
FROM
    details d
    INNER JOIN (
       SELECT employee_id
       FROM details
       GROUP BY employee_id
       HAVING COUNT(*) > 1
    ) p ON d.employee_id = p.employee_id
 

Это также можно сделать с помощью предложения OVER

 SELECT employee_id, Name, phone
FROM (
   SELECT 
      employee_id, Name, phone, 
      COUNT(*) OVER (PARTITION BY employee_id) AS phone_count
   FROM details
) t
WHERE t.phone_count > 1
 

Комментарии:

1. Привет, пожалуйста, проверьте мой отредактированный вопрос. Как отобразить имя, если оно недоступно в таблице detailis, но доступно в таблице employees?

2. При использовании объединения вам действительно не нужна никакая агрегация здесь

3. @Пожалуйста, затем замените детали на детали объединения сотрудников

Ответ №3:

 SELECT employee_id, t1.Name, phone
FROM details
JOIN employees t1 USING (employee_id)
WHERE employee_id IN (
   SELECT employee_id
   FROM details
   GROUP BY employee_id
   HAVING COUNT(*) > 1
)
 

Это будет получено с именем из 1-й таблицы