【问题标题】:Get the employees who have more than one phone number with MySQL使用 MySQL 获取拥有多个电话号码的员工
【发布时间】:2021-03-16 05:33:43
【问题描述】:

我有两张表,一张是employees,另一张是details。在这里,我需要查询来显示拥有多个电话号码的员工。

员工表:

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

【问题讨论】:

  • 另请注意,detailsemployees 都没有 Name。要获取名称,请使用JOIN
  • 更新了我的问题@Akina

标签: mysql sql


【解决方案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

【讨论】:

  • @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
)

我也可以用 JOIN 来写:

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

【讨论】:

  • 嗨,请检查我编辑的问题。名称在detailis表中不可用但在employees表中可用时如何显示?
  • 如果使用连接,这里不需要任何聚合
  • @Kindly,然后用员工 JOIN 详细信息替换详细信息
【解决方案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
)

这将从第一个表中获得名称

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    相关资源
    最近更新 更多