如何使用具有多个连接的聚合函数?

时间:2014-04-21 18:02:48

标签: mysql sql

我需要找到员工Milo的最大工作经验。这是我的表:

CREATE TABLE company (
  id   INT          NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(250) NOT NULL
);

CREATE TABLE employee (
  id   INT          NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(250) NOT NULL
);

CREATE TABLE company_employee (
  company_id  INT NOT NULL,
  employee_id INT NOT NULL,
  hire_date   DATE DEFAULT NULL,
  resign_date DATE DEFAULT NULL,
  FOREIGN KEY (company_id) REFERENCES company (id),
  FOREIGN KEY (employee_id) REFERENCES employee (id)
);

我的查询得到了Milo的所有公司

SELECT
  employee.name, company.name, company_employee.hire_date, 
  company_employee.resign_date, 
  (company_employee.resign_date - company_employee.hire_date)   
FROM company
  JOIN company_employee
    ON (company.id = company_employee.company_id)
  JOIN employee
    ON (company_employee.employee_id = employee.id)
  WHERE employee.name = 'Milo'

返回

+------+--------------+-----------+-------------+-----------------+
| name | company_name | hire_date | resign_date | experience_days | 
+------+--------------+-----------+-------------+-----------------+
| Milo | IBM          |1997-04-17 | 1998-03-08  | 325             | 
| Milo | IBM          |2012-04-03 | 2014-02-15  | 683             |
| Milo | IBM          |2000-08-10 | 2003-01-01  | 874             |
+------+--------------+-----------+-------------+-----------------+

但我只需要一个有最大经验的记录

+------+-----+------------+------------+-----+
| Milo | IBM | 2000-08-10 | 2003-01-01 | 874 |
+------+-----+------------+------------+-----+

UPD:

此查询查找每家公司所有员工的金额

SELECT
  company.name,
  COUNT(company_employee.employee_id)
FROM company
  LEFT JOIN company_employee
    ON company.id = company_employee.company_id
GROUP BY company.name
HAVING COUNT(company_employee.employee_id) > 0;

我可以简化吗?

1 个答案:

答案 0 :(得分:1)

您不需要聚合功能(MAX),因为您没有在这里汇总任何内容。

您只需添加ORDER BYLIMIT条款,例如:

ORDER BY experience_days DESC
LIMIT 1

整个查询可能是:

SELECT
  employee.name, company.name, company_employee.hire_date, 
  company_employee.resign_date, 
  (company_employee.resign_date - company_employee.hire_date)  as experience_days
FROM company
  JOIN company_employee
    ON (company.id = company_employee.company_id)
  JOIN employee
    ON (company_employee.employee_id = employee.id)
  WHERE employee.name = 'Milo'   
ORDER BY experience_days DESC
LIMIT 1

@Update

是的,您可以简化查询。

首先,您可以使用JOIN代替LEFT JOIN,因为您正在寻找有员工的公司。

然后,因为您将只获得有员工的公司(必须存在员工队伍才能加入公司),您不需要使用HAVING条件。

SELECT
  company.name,
  COUNT(company_employee.employee_id)
FROM company
  JOIN company_employee
    ON company.id = company_employee.company_id
GROUP BY company.name;