Mysql 获取最后日期项的SQL查询
我正在尝试执行一个相当复杂的查询,但不知道如何将其作为一个MySQL查询来执行。 给出3张表格 员工、办公室、员工注意事项 员工不直接与办公室联系,因为他们可以定期移动办公室。移动时,员工便笺将用新的办公室id更新。因此,员工便笺中的每一行都有办公室id、员工id和切换日期。如果我想获取给定员工的当前办公室id,我可以执行以下操作: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
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。您可以根据需要加入适当的参考表。我注意到这与你在问题中的例子是一致的。是的,你是正确的。我对你的第二个例子和员工做了一个内部连接,看起来很有效。谢谢