MySQL分组和排序

问题描述 投票:1回答:4
mysql> describe jobs;
+--------------+---------+------+-----+---------+----------------+
| Field        | Type    | Null | Key | Default | Extra          |
+--------------+---------+------+-----+---------+----------------+
| job_id       | int(11) | NO   | PRI | NULL    | auto_increment |
| candidate_id | int(11) | NO   | MUL | NULL    |                |
| company_id   | int(11) | NO   | MUL | NULL    |                |
| start_date   | date    | NO   | MUL | NULL    |                |
| end_date     | date    | NO   | MUL | NULL    |                |
+--------------+---------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

每个候选人可以有多个工作。我想为每个候选人找到最新工作(基于开始日期,因为可以将注册结束日期,然后检查)(在PHP中),如果end_Date不是注册日期。

((如果您的最后截止日期不是注册日期,那么您目前正在失业,这就是我想要的;我不知道如何在查询中执行此操作,因此将在PHP中执行此操作) 。

查询SELECT candidate_id, end_Date FROM jobs ORDER BY candidate_id , start_date DESC使我到达一半。

+--------------+------------+
| candidate_id | end_Date   |
+--------------+------------+
|            1 | 2019-08-31 |
|            1 | 2019-01-31 |
|            1 | 2019-05-31 |
|            2 | 0000-00-00 |
|            2 | 2018-02-28 |
|            2 | 2017-05-31 |
|            2 | 2016-09-30 |
|            3 | 0000-00-00 |
|            3 | 2019-05-31 |
|            4 | 2019-04-30 |
|            4 | 2019-09-30 |

((如何)我只能获得每个候选ID的第一个条目(行号为start_date最近的行?而且我只能得到那些没有注册截止日期的文件吗?

(糟糕,看来我在end_date之前的订购无效)

mysql sql greatest-n-per-group
4个回答
2
投票
您可以使用相关子查询进行过滤:

select j.* from jobs j where j.start_date = ( select max(start_date) from jobs j1 where j1.candidate_id = j.candidate_id and j1.end_date <> '0000-00-00' )

子查询返回当前候选人的最大start_date不是end_date的最大null

解决此每组头1个问题的另一种典型方法是使用anti-左连接:

select j.* from jobs j left join jobs j1 on j1.candidate_id = j.candidate_id and j1.start_date > j.start_date and j1.end_date is not null where j.end_date is not null and j1.job_id is null

[此短语为:给我具有非null end_date的记录,对于该记录,不存在具有相同candidate_id,更大start_date和非null end_date的其他记录。] >

1
投票
您可以在候选人的最大开始日期组上使用联接

1
投票
不带子查询的选项:

0
投票
您可以通过聚合来做到这一点:
© www.soinside.com 2019 - 2024. All rights reserved.