Mysql 获取最后日期项的SQL查询

Mysql 获取最后日期项的SQL查询,mysql,sql,Mysql,Sql,我正在尝试执行一个相当复杂的查询,但不知道如何将其作为一个MySQL查询来执行。 给出3张表格 员工、办公室、员工注意事项 员工不直接与办公室联系,因为他们可以定期移动办公室。移动时,员工便笺将用新的办公室id更新。因此,员工便笺中的每一行都有办公室id、员工id和切换日期。如果我想获取给定员工的当前办公室id,我可以执行以下操作: SELECT en.office_id FROM employee_notes AS en WHERE en.employee_id = 'userid' ORD

我正在尝试执行一个相当复杂的查询,但不知道如何将其作为一个MySQL查询来执行。 给出3张表格

员工、办公室、员工注意事项

员工不直接与办公室联系,因为他们可以定期移动办公室。移动时,员工便笺将用新的办公室id更新。因此,员工便笺中的每一行都有办公室id、员工id和切换日期。如果我想获取给定员工的当前办公室id,我可以执行以下操作:

 SELECT en.office_id FROM employee_notes AS en WHERE en.employee_id =
'userid' ORDER BY date DESC LIMIT 1;
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,并且我想让所有员工在给定日期在该办公室工作,我不确定如何进行查询

我的第一次尝试是:

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);
问题是,在上面的查询中,内部选择不会筛选具有给定办公室id的员工备注。因此,我可以执行以下操作:

 SELECT en.office_id FROM employee_notes AS en WHERE en.employee_id =
'userid' ORDER BY date DESC LIMIT 1;
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);
然后,内部查询只查看具有office id“someOfficeId”的办公室。e、 g.如果员工A一周前在某个办公室工作,但后来换到了另一个办公室,内部查询将无法识别这一点,整个查询将显示员工A是某个办公室的员工

因此,我的下一个想法是将en.office\u id='someOfficeId'置于内部查询之外。 e、 g

但是,这会产生一个MySQL错误,因为我在WHERE子句中引用了en别名。 我真的不确定下一步该试什么


感谢您的帮助。

也许最简单的方法是使用子字符串索引/组目录技巧获取最新的office:

SELECT en.employee_id,
       substring_index(group_concat(office_id order by date desc), ',', 1) as office_id
FROM employee_notes en
WHERE en.date < 'somedate'
GROUP BY en.employee_id
HAVING office_id = 'someoffice';

戈登似乎尝试了一个更优雅/复杂的解决方案。 我试图坚持基本原则。。。希望你能说我取得了一些成功

/* how do you know, however, to which office an employee belongs if he/she had no switch whatsoever? is there an office field in the employees table ? */
SELECT NVL(n.office_id, e.office_id ) officeId, NVL(n.employee_id, e.employee_id) employeeID
FROM
   /* gives the last switch per employee (employees not listed here had no switch) */
   (SELECT employee_id, date_of_switch
    FROM employee_notes n
    GROUP BY employee_id, max(date_of_switch)) m,
    /* join with employee_notes to get the office of the last switch */
    employee_notes n,
    employees e
WHERE
    /* if employee is not listed in M, he/she had no switch */
    e.employee_id = m.employee_id (+)
AND n.switch_date = m.switch_date
AND n.employee_id = m.employee_id
ORDER BY 
  officeId

隐马尔可夫模型。。。这给了我员工的笔记,而不是employees@Caveman . . . 它为您提供员工id和办公室id。您可以根据需要加入适当的参考表。我注意到这与你在问题中的例子是一致的。是的,你是正确的。我对你的第二个例子和员工做了一个内部连接,看起来很有效。谢谢