Корзина для веб-браузера файлов - PullRequest
0 голосов
/ 17 апреля 2019

Я создаю сетевой файловый менеджер для управления документами.Пользователи имеют доступ к своим файлам и могут удалять файлы.При удалении есть возможность получить файлы / папки.Путь к файлам хранится в базе данных с логическим полем: IsActive, которое указывает, был ли удален файл / папка.

Табличная структура в базе данных выглядит следующим образом:

Name    IsDirectory IsActive     Path                              Parent
----------------------------------------------------------------------------------------------
1.txt     0           0          /Home/usr1/New Folder/1.txt       /Home/usr1/New Folder/
a         1           0          /Home/usr1/New Folder/Docs        /Home/usr1/New Folder/
2.txt     0           0          /Home/usr1/New Folder/Docs/2.txt  /Home/usr1/New Folder/Docs

Как видно, пользователь удаляет файл (1.txt) из «Новой папки» и удаляет папку«Документы», который содержит «2.txt».Я показываю это, чтобы пользователь мог восстановить или навсегда удалить файл или папку.Я также перехватываю родительскую папку в папке / файле.Таким образом, логично, когда я отображаю данные, файл 2.txt не должен быть виден, но должен быть виден его родитель, то есть папка Docs.

Как мне написать запрос, чтобы получить правильные данные.Мой текущий запрос помогает в выборе отдельного Родителя, чей Родитель не находится в Путь, и затем присоединяется к нему для извлечения записей.

WITH parents AS
    (SELECT DISTINCT par.Parent
        FROM   tblFilesNFolders par
        WHERE  par.Parent NOT IN (SELECT DISTINCT Path FROM tblFilesNFolders WHERE IsActive = 0) 
            AND par.IsActive = 0)
SELECT grid.Name, grid.IsDirectory, grid.IsActive, grid.Path, grid.Parent 
    FROM tblFilesNFolders grid
    INNER JOIN parents ON grid.Parent = parents.Parent
    WHERE grid.IsActive = 0 AND grid.Path LIKE '/Home/usr1%'

Мне удалось получить начальный уровень, но когда я изменил путь как /Home/usr1/New Folder/Docs% не показывает файл 2.txt.

Каким должен быть мой запрос?

1 Ответ

1 голос
/ 21 апреля 2019

Проблема в вашем запросе заключается в том, что вам нужно выполнить еще одно соединение. Сначала выберите данные, которые необходимо отобразить (все удаленные файлы без иерархий). Затем выберите тех родителей, которые не в пути. Поскольку имя папки также находится в пути, затем объедините эту таблицу с первой таблицей в Parents, чтобы выбрать данные.

SELECT [ID], [Path], [Name], [Parent], [IsDirectory], [IsActive], [Size], [Owner]
INTO #temp
FROM [MFTFileExplorer].[dbo].[tblFilesNFolders]
WHERE Parent LIKE '/home/usr1%’ AND IsActive = 0;
WITH finally AS
(SELECT DISTINCT Parent
FROM #temp m1
WHERE Parent NOT IN (
SELECT Path FROM #temp WHERE Path LIKE '/%'
)
)
SELECT * FROM #temp fin
INNER JOIN finally ON finally.Parent = fin.Parent
WHERE fin.Path LIKE '/%'

Не забудьте поставить «/» перед «%», так как он отделяет папки от файлов без столбца IsDirectory.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...