Например, у меня есть таблица отчетов с идентификатором организации, которая имеет несколько строк на каждый год.
| 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
и таблицу report_files следующим образом
| 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
Я бы хотел получить самую последнюю запись из таблицы отчетов, т.е. Если существуют строки 2016 и 2017, я бы хотел получить 2017, и если бы существовал только 2016, то получите это и оставите присоединение к таблице report_file, чтобы получить столбец report_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
Возможно, не правильно объяснили, пожалуйста, дайте мне знать, если вопрос не ясен. В принципе, хотите группировать groupisation_id в таблице отчетов, но получить самую последнюю строку, если существует 2017, тогда получите это, если не получите 2016, а затем оставите присоединение к таблице report_files, чтобы увидеть, прикреплен ли файл к самому последнему идентификатору отчета, если это так return file else возвращает null. Надеюсь, это имеет смысл.
Заранее спасибо.
Попробуй это:
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;
Посмотрите, как это работает на SQL Fiddle.
На основе результата, который вы хотите, я бы хотел сделать LEFT JOIN
на промежуточной таблице, как MAX(Report_Year)
ниже, после выбора 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