【发布时间】:2015-03-01 13:46:08
【问题描述】:
我正在尝试执行一个相当复杂的查询,但无法弄清楚如何将其作为单个 MySQL 查询来执行。 给定3张桌子
员工、办公室、员工笔记
员工与办公室没有直接联系,因为他们可以定期搬迁。当他们搬家时,employee_notes 会更新为新的办公室 ID。所以员工笔记中的每一行都有一个office_id、employee_id和切换日期。如果我想获取给定员工的当前办公室 ID,我可以这样做:
SELECT en.office_id FROM employee_notes AS en WHERE en.employee_id =
'userid' ORDER BY date DESC LIMIT 1;
但是,如果给我一个办公室,即我有 office_id,并且我想让所有员工在给定日期在该办公室工作,我不确定如何进行查询。
我的第一次尝试是这样的:
SELECT emp.* FROM employees AS emp WHERE emp.id = (SELECT en.employee_id FROM employee_notes AS en WHERE en.date < 'somedate' ORDER BY date DESC LIMIT 1);
问题是,在上面的查询中,内部 SELECT 没有过滤具有给定办公室 ID 的employee_notes。所以我可以这样做:
SELECT emp.* FROM employees AS emp WHERE emp.id = (SELECT en.employee_id FROM employee_notes AS en WHERE en.date < 'somedate' AND en.office_id = 'someOfficeId' ORDER BY date DESC LIMIT 1);
然后内部查询仅查看办公室 ID 为“someOfficeId”的办公室。例如如果员工 A 一周前在 someOffice' 工作,但后来换到另一个办公室,内部查询将无法识别这一点,整个查询将给我员工 A 作为 someOffice 的员工。
所以,我的下一个想法是将 en.office_id = 'someOfficeId' 置于内部查询之外。 例如
SELECT emp.* FROM employees AS emp WHERE emp.id = (SELECT en.employee_id FROM employee_notes AS en WHERE en.date < 'somedate' ORDER BY date DESC LIMIT 1) AND en.office_id = 'someOfficeId';
但是,这会导致 MySQL 错误,因为我在 WHERE 子句中引用了 en 别名。 我不确定接下来要尝试什么。
任何帮助表示赞赏。
【问题讨论】: