【问题标题】:I want to write a SQL Query that will determine the company having highest no .of employees, & then display it's employees with previous company我想编写一个 SQL 查询来确定员工人数最多的公司,然后显示它是以前公司的员工
【发布时间】:2021-10-27 08:56:49
【问题描述】:

我有一个包含以下两个表的架构

1.人 -

+-------+----------------+------------+-----------------+-----------------+
| ID    | NAME           | DOJ        | PREV_COMPANY_ID | CURR_COMPANY_ID |
+-------+----------------+------------+-----------------+-----------------+
| 1795f | ALEX BROWN     | 1973-03-02 | 4e5b            | 123a            |
| 8772  | Chris Mitchell | 2016-06-15 | 4746            | 4e5b            |
| 5e03  | Patt Hobbs     | 1976-09-14 | 4e5b            | 123b            |
+-------+----------------+------------+-----------------+-----------------+

2。公司 -

+-------+---------------+
| ID    | NAME          |
+-------+---------------+
| 4746  | Mora-Sullivan |
| 49de6 | Harmon-Miller |
| 4e5b  | Fakesmith     |
+-------+---------------+

我想编写查询以找到以下内容-

  1. 首先确定员工人数最多的公司,然后显示其在前公司的员工。

我找到了使用 sql 查询的员工人数最多的公司。即这里的Fakesmith。

SELECT PREV_COMPANY_ID, COUNT(*) as count 
FROM PEOPLE 
GROUP BY PREV_COMPANY_ID
ORDER BY count DESC;

但我无法建立任何逻辑来找到使用以前公司名称的员工人数最多的当前雇主。我该如何解决这个问题?

【问题讨论】:

  • 你如何确定“员工人数最多的公司/公司”,如果是一个最大值,你只想要那个,如果最大值是两条记录,你只想要这个两条记录?
  • 我只想要一个最大值记录,因为这里的测试用例只能有一个值记录。
  • @AlexandreLéonard 不,它应该是 PREV_COMPANY_ID,因为我们想从 prev_company_id 确定最多的员工数量,然后检查在该公司工作的员工的 curr_company_id,然后使用 previous_company 显示他们的姓名。此外,您的查询返回错误代码 1241 操作数应包含 1 列

标签: mysql sql join logic case


【解决方案1】:

您是否正在尝试这样的事情:

create table people(
id varchar(9) not null ,
name varchar(50) not null ,
doj date ,
PREV_COMPANY_ID varchar(50),
CURR_COMPANY_ID varchar(50),
Primary key id(`id`)
);

insert into people values ('1795f','ALEX BROWN','1973-03-02','4e5b','123a'),('8772','Chris Mitchell','2016-06-15','4746','4e5b'),('5e03','Patt Hobbs','1976-09-14','4e5b','123b');


create table company(
id varchar(9) not null ,
name varchar(50) not null ,
Primary key id(`id`)
);

insert into company values ('4746','Mora-Sullivan'),('49de6','Harmon-Miller'),('4e5b','Fakesmith');


select p.name,p.CURR_COMPANY_ID,company.name as company_name 
from people p join (select PREV_COMPANY_ID ,count(*) as comp_high_nr from people group by PREV_COMPANY_ID  order by comp_high_nr desc limit 1) as t on p.CURR_COMPANY_ID =t.PREV_COMPANY_ID join company on p.PREV_COMPANY_ID=company.id  ;

【讨论】:

    【解决方案2】:

    试试这个对你有帮助

    CREATE TABLE tblcompany (
      id varchar(9) NOT NULL,
      name varchar(50) NOT NULL,
      PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
    INSERT INTO tblcompany (id,name) VALUES 
     ('1','Mora-Sullivan'),
     ('2','Harmon-Miller'),
     ('3','Fakesmith');
    
    CREATE TABLE tblpeople (
      id varchar(9) NOT NULL,
      name varchar(50) NOT NULL,
      doj date DEFAULT NULL,
      PREV_COMPANY_ID varchar(50) DEFAULT NULL,
      CURR_COMPANY_ID varchar(50) DEFAULT NULL,
      PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    
    INSERT INTO tblpeople (id,name,doj,PREV_COMPANY_ID,CURR_COMPANY_ID) VALUES 
     ('1','ALEX BROWN','1973-03-02','1','2'),
     ('2','Chris Mitchell','2016-06-15','1','3'),
     ('3','Patt Hobbs','1976-09-14','2','3');
    

    首先,我们需要找到员工最高的公司

    SELECT t1.CURR_COMPANY_ID, COUNT(t1.id) as `NoOfEmployee` FROM tblpeople as t1 GROUP BY t1.CURR_COMPANY_ID ORDER BY NoOfEmployee DESC LIMIT 1;
    

    然后我们加入人员表以获取该公司的所有员工

    SELECT t1.*, t2.name as `CURR_COMPANY`, t3.name as `PREV_COMPANY` FROM tblpeople as t1 LEFT JOIN tblcompany as t2 ON t1.CURR_COMPANY_ID=t2.id LEFT JOIN tblcompany as t3 ON t1.PREV_COMPANY_ID=t3.id INNER JOIN (SELECT CURR_COMPANY_ID, COUNT(id) as EmployeeCount FROM tblpeople GROUP BY CURR_COMPANY_ID ORDER BY EmployeeCount DESC LIMIT 1) as t4 ON t1.CURR_COMPANY_ID=t4.CURR_COMPANY_ID;
    

    【讨论】:

      【解决方案3】:

      请检查以下查询是否符合您的目的

      SELECT *
        FROM PEOPLE
       WHERE CURR_COMPANY_ID IN (  SELECT PREV_COMPANY_ID
                                     FROM (  SELECT PREV_COMPANY_ID, COUNT (1) AS C
                                               FROM PEOPLE
                                           GROUP BY CURR_COMPANY_ID
                                           ORDER BY C DESC)
                                 ORDER BY c DESC)
      

      【讨论】:

      • 谢谢,但我想显示 Chris Mitchell 的当前公司名称,所以我该怎么做?,我知道可以使用 join 来完成,但我知道如何在这段代码中实现它你提供了吗?
      • 试试这个 SELECT * ,(select name from company where id=CURR_COMPANY_ID) FROM PEOPLE WHERE CURR_COMPANY_ID IN (SELECT PREV_COMPANY_ID FROM (SELECT PREV_COMPANY_ID, COUNT (1) AS C FROM PEOPLE GROUP BY CURR_COMPANY_ID ORDER BY C DESC) 按 c DESC 排序) ;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      相关资源
      最近更新 更多