搜索查询加入 3 个表,1 个表有日期
Posted
技术标签:
【中文标题】搜索查询加入 3 个表,1 个表有日期【英文标题】:search query joining 3 tables, 1 table has date 【发布时间】:2014-02-10 15:09:47 【问题描述】:我有 3 个表,员工表、教育背景和职位, 我需要加入 3 个表并选择员工毕业的最近一年。下面列出了我需要的结果查询。
员工表
|ID | employee_id | Name |
| 1 | 123 | Jewel Brin |
| 2 | 554 | Donna Ferry |
| 3 | 853 | Ricky David |
教育背景
|ID | employee_id | School/level | date graduated |
| 1 | 123 | highschool | 2007 |
| 2 | 123 | college | 2011 |
| 3 | 554 | college | 2010 |
| 4 | 554 | masteral | 2013 |
职位
|ID | employee_id | Job description |
| 1 | 123 | Free lancer |
| 2 | 554 | admin assistant |
| 3 | 853 | Support Admin |
我需要选择员工教育背景的最新日期信息
结果是:
结果查询
|ID | employee_id | Name | Job title | year_graduated | school_institute |
| 1 | 123 | Jewel Brin | Free Lancer | 2011 | college |
| 2 | 554 | Donna Ferry | Admin Assistant | 2013 | masteral |
| 3 | 853 | Ricky David | Support Admin | Null | Null
【问题讨论】:
@vincent See Fidde Demo Here @MKhalidJunaid 请查看员工 123 Jewel Brin,员工 Jewel Brin 的级别是高中,这是错误的,答案应该是大学。代码有什么问题? @MKhalidJunaid - 请尝试查看错误。谢谢。 【参考方案1】:对于mysql你可以试试这个
SELECT DISTINCT
e.employee_id,
e.Name,
j.Job_description,
eb.year_graduated,
eb.level
FROM
EMPLOYEE e
LEFT JOIN
(SELECT
*,
MAX(t.date_graduated) year_graduated
FROM
(SELECT * FROM Background ORDER BY date_graduated DESC) t
GROUP BY employee_id) eb
ON (e.employee_id = eb.employee_id)
LEFT JOIN JobTitle j
ON (e.employee_id = j.employee_id)
See Fiddle Demo
【讨论】:
请查看员工 123 Jewel Brin,员工 Jewel Brin 的级别是高中,错误,答案应该是大学。代码有什么问题? @Vincent 使用updated fiddle查看我的更新答案【参考方案2】:在 SQL Server 中:-
Select *
from
(
Select e.ID,e.employee_ID,e.Name,
b.Level,j.[Job description],
rn = row_number()
over (partition by e.Employee_ID order by [date graduated] desc)
From Employee e
left join Background b
on e.Employee_ID = b.Employee_ID
left join Jobtitle j
on j.Employee_ID = b.Employee_ID
)a
where a.rn=1
SQL FIDDLE
【讨论】:
我编辑了我的问题。请参考这个。谢谢你! 检查更新的答案。您需要所有员工,无论他们是否有任何背景。所以在那种情况下你需要用Left join
替换inner join
Row_number
按员工 ID 返回一个序号组。因此,例如,如果有 3 名员工的 ID=3,那么他们将根据 graduated dete
顺序编号。 rn
是别名
上述查询在sql server中工作。我不确定Mysql
中的语法
查询在 Mysql 中不起作用。还有其他方法吗?【参考方案3】:
忘了说,这是 MySQL :)
SELECT e.employee_id, Name, `Job description` AS `Job title`, year_graduated, school_institute
FROM `employee` e
INNER JOIN job_title j ON j.employee_id = e.employee_id
LEFT JOIN (SELECT ID, `School/level` AS school_institute, employee_id, `date graduated` AS year_graduated FROM `educational background` b
INNER JOIN (
SELECT ID, MAX(`date graduated`) AS max_date FROM `educational background` GROUP BY employee_id
) b2
ON b2.max_date = b.year_graduated AND b2.ID = b.ID
) bb ON bb.employee_id = e.employee_id
【讨论】:
我编辑了我的问题。我也需要有没有教育背景的人的结果。谢谢 我编辑了我的问题,请参考下面的结果查询。谢谢! @Vincent 你不明白我的查询吗? @-NewInTheBusiness 我编辑了我的问题。我遇到了新问题。以上是关于搜索查询加入 3 个表,1 个表有日期的主要内容,如果未能解决你的问题,请参考以下文章
连接 5 个表 - 1 个主表加上 4 个主表有多行,但主数据重复