搜索查询加入 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 个主表有多行,但主数据重复

如何在日期列上查询 2 个表,如果不存在匹配的日期,那么我们必须加入下一个最大日期

mysql加入3个表并计数

如何从 2 个表中选择最近的日期时间

mysql加入2个表 - 但必须加入同一个表两次

如何用 sqlite 加入这四个表