Как я могу отфильтровать таблицу на основе данных других таблиц, имеющих условие? - PullRequest
0 голосов
/ 23 октября 2018

Это folders таблица:

+------------+
| id  name   |
|------------|
|  1  dir1   |
|  2  dir2   |
+------------+

Это files таблица:

+------------------------------+
| id  folder_id  name  deleted |
|------------------------------|
|  1  1          file1 true    |
|  2  1          file2 false   |
|  1  2          file3 true    |
|  2  2          file4 true    |
+------------------------------+

Как видите, dir1 и dir2 имеет 2 файлаза реж.Но в dir1 удален только один файл и один файл доступен.Тем не менее, dir2 имеет 2 файла, но оба они удалены.Таким образом, там не осталось никаких файлов.

Я пытаюсь получить таблицу папок и директории, в которых нет файлов (все удалены).

Пока я пробовал это, но сделалне работает.

SELECT
    "dirs".* 
FROM
    "dirs"
    INNER JOIN "files" ON ( "files"."folder_id" = "folders"."id" ) 
WHERE
    ( "files"."deleted" IS FALSE ) 
GROUP BY
    "folders".ID 
HAVING
    COUNT ( files.ID ) != 0 /* or > 0 or == 0 */

Ожидаемый результат:

+------------+
| id  name   |
|------------|
|  2  dir2   |
+------------+

Поскольку dir2 имеет файлы, но все удалены.

1 Ответ

0 голосов
/ 23 октября 2018

Использование where not exists:

select *
from folders d
where not exists (
    select 1
    from files f
    where folder_id = d.id
    and not deleted)

Рабочий пример в rextester.

...