mysql按选择最近记录分组

lyfkaqu1  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(291)

例如,我有一个带有organization id的reports表,它每年都有多行。

| ID | Organisation ID | Report Year 
--------------------------------------
|  1 |   1             | 2016        
|  2 |   1             | 2017        
|  3 |   12            | 2016        
|  4 |   12            | 2017        
|  5 |   13            | 2016        
|  6 |   13            | 2017        
|  7 |   14            | 2016

以及一个报表文件表,如下所示

| ID | Report Type ID | Report ID   | Report File
---------------------------------------------------
|  1 | 1              | 1          | org1_test_report_2016.pdf
|  3 | 1              | 3          | org1_test_report_2016.pdf
|  5 | 1              | 5          | org1_test_report_2016.pdf
|  6 | 1              | 6          | org1_test_report_2017.pdf
|  7 | 1              | 7          | org1_test_report_2016.pdf

我想从reports表中获取最新的记录,即如果2016和2017行存在,我想获取2017,如果只有2016行存在,则获取该记录并将其留在reports\u file表中,以获取带有文件名的report\u file列(如果该id存在,则返回null)。像这样的。

| Report ID | Organisation ID | Report File
----------------------------------------------
| 2         | 1               | NULL
| 4         | 12              | NULL
| 6         | 13              | org1_test_report_2017.pdf
| 7         | 14              | org1_test_report_2016.pdf

可能没有解释清楚,如果问题不清楚请告诉我。基本上是想在reports表上按组织id分组,但要获取最新的行,如果存在2017,则获取该行,如果不存在,则获取2016,然后左键连接report\u files表上的该行,以查看文件是否附加到最新的report id,如果是,则返回file,否则返回null。希望这有意义。
提前谢谢。

fhity93d

fhity93d1#

根据你想要的结果我想做一个 LEFT JOIN 选择后在中间表上显示如下 MAX(Report_Year) :

SELECT C.Report_ID, A.Organisation_ID, C.Report_File 
FROM
(SELECT Organisation_ID, MAX(Report_Year) Latest_Report_Year
FROM reports GROUP BY Organisation_ID) A 
JOIN reports B ON A.Organisation_ID=B.Organisation_ID AND
A.Latest_Report_Year=B.Report_Year
LEFT JOIN report_files C ON B.ID=C.Report_ID;

结果:

| Report ID | Organisation ID | Report File
----------------------------------------------
| 2         | 1               | NULL
| 4         | 12              | NULL
| 6         | 13              | org1_test_report_2017.pdf
| 7         | 14              | org1_test_report_2016.pdf

在这里摆弄

rhfm7lfc

rhfm7lfc2#

试试这个:

SELECT C.Report_ID, A.Organisation_ID, C.Report_File 
FROM
(SELECT Organisation_ID, MAX(Report_Year) Latest_Report_Year
FROM reports GROUP BY Organisation_ID) A 
JOIN reports B ON A.Organisation_ID=B.Organisation_ID AND A.Latest_Report_Year=B.Report_Year
JOIN report_files C ON B.ID=C.Report_ID;

看看它在sqlfiddle上运行。

相关问题