Пройдите через mysql запись, чтобы найти последнюю измененную запись - PullRequest
2 голосов
/ 26 января 2020

Я использую MySQL v5.7, у меня есть структура папок с двумя таблицами, подобная этой в MySQL:

папках Таблица:

|folder_id   |  parent_id |   modified_by | updated_at        |
+------------+------------+---------------+-------------------+
|     1      |     NULL   |    Andy       |2020-12-11 11:13:25|
|     2      |      1     |    Andy       |2020-01-26 14:22:03|
|     3      |      1     |    Mary       |2020-01-25 03:55:03|
|     5      |      2     |    Ruby       |2020-01-15 22:13:33| 
|     6      |      2     |    Mary       |2020-01-18 00:52:44|

документы Таблица:

|document_id |  folder_id |   modified_by | updated_at        |
+------------+------------+---------------+-------------------+
|     1      |      NULL  |    Andy       |2019-12-11 13:12:25|
|     2      |      2     |    Janice     |2020-01-25 01:55:03|
|     3      |      2     |    Katy       |2020-01-11 03:55:03|
|     5      |      3     |    Mary       |2020-01-12 01:55:03| 
|     6      |      6     |    Mary       |2020-01-26 13:14:12|

Таким образом, в основном эти две таблицы предназначены для моей системы файлового менеджера, мне нужно извлечь папку и документы на основе folder_parent_id, этот столбец должен Отметьте, если папка находится внутри другой папки, так что другая папка будет родительской. если parent_id равно NULL, это означает, что папка находится в root каталога. Что касается документа, он может находиться в другой папке или в каталоге root (folder_id имеет значение null). Я использую этот запрос для слияния папки и документов:

SELECT folder_id, 
    NULL AS document_id, modified_by, updated_at
FROM folders 
WHERE parent_id = given_parameter

UNION

SELECT NULL as folder_id, 
    document_id, modified_by, updated_at
FROM documents 
WHERE folder_id = given_parameter 

функция, которую я хочу реализовать, заключается в получении последнего значения update_at для каждой подпапки внутри папки или файла внутри папки / подпапка, поэтому вместо того, чтобы показывать значение updated_at для папки, он будет искать самую последнюю update_at и кто ее изменил.

Ожидаемый результат с parent_id=null / folder_id=null

folder_id|document_id|modiefied_by|      updated_at     |
---------+-----------+------------+---------------------+
    1    |   NULL    |   Andy     | 2020-01-26 14:22:03 |
    NULL |     1     |   Andy     | 2019-12-11 13:12:25 |

1 Ответ

0 голосов
/ 26 января 2020
SELECT document_id, f.folder_id, 

(CASE WHEN f.updated_at > d.updated_at THEN f.modified_by ELSE d.modified_by END) AS modified_by, 
(CASE WHEN f.updated_at > d.updated_at THEN f.updated_at ELSE d.updated_at END) AS updated_at,
(CASE WHEN f.updated_at > d.updated_at THEN 'folder' ELSE 'document' END) AS because 

FROM `documents` AS d LEFT JOIN folders AS f ON f.folder_id=d.folder_id ORDER BY d.updated_at DESC, f.updated_at DESC
+-------------+-----------+-------------+---------------------+----------+
| document_id | folder_id | modified_by | updated_at          | because  |
+-------------+-----------+-------------+---------------------+----------+
|           6 |         6 | Mary        | 2020-01-26 13:14:12 | document |
|           2 |         2 | Andy        | 2020-01-26 14:22:03 | folder   |
|           5 |         3 | Mary        | 2020-01-25 03:55:03 | folder   |
|           3 |         2 | Andy        | 2020-01-26 14:22:03 | folder   |
|           1 |      NULL | Andy        | 2019-12-11 13:12:25 | document |
+-------------+-----------+-------------+---------------------+----------+

Это вернется с разумом ...

...