我需要找到员工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;
我可以简化吗?
答案 0 :(得分:1)
您不需要聚合功能(MAX
),因为您没有在这里汇总任何内容。
您只需添加ORDER BY
和LIMIT
条款,例如:
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;