SQL-запрос, который объединяет, фильтрует по определенному элементу и возвращает бесплатные записи - PullRequest
0 голосов
/ 06 января 2019

У меня есть 2 таблицы:

сайтов: эта таблица представляет список сайтов и некоторую информацию о них Задачи: таблица, которая назначает задачи конкретным сотрудникам по сайту и по дате

Мне нужен запрос, который возвращает все сайты, которые еще не включены в задачи на определенную дату.

Самое близкое, что я получил, это следующее:

SELECT 
    sites.ID, 
    sites.name 
FROM 
    sites
    LEFT JOIN tasks ON tasks.site_ID = sites.ID
WHERE tasks.ID IS NULL

Этот запрос возвращает сайты, которые еще не перечислены во всей таблице задач, а не только сайты на определенную дату.

Я относительно новичок в этих более сложных запросах, так что терпите меня, поскольку я, вероятно, упускаю что-то очевидное. Мне просто трудно обдумать проблему.

Чтобы повторить, если таблица1 - это сайты, а таблица2 - это задачи, мне нужен запрос, который возвращает мне все элементы таблицы1, которые еще не перечислены в таблице2 на конкретную дату.

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Использовать коррелированный подзапрос:

SELECT 
    s.ID,
    s.name
FROM sites s
WHERE NOT EXISTS (SELECT 1 FROM tasks WHERE site_ID = s.ID and date = ?)

Где знак вопроса - это дата, которую вы хотите проверить.

0 голосов
/ 06 января 2019

Если я правильно понимаю, вы хотите, чтобы все комбинации сайта / даты, которые не были назначены .

Если это так, вы делаете это с CROSS JOIN, чтобы сгенерировать все возможные комбинации, а затем какой-то метод, скажем, LEFT JOIN/WHERE, чтобы удалить существующие:

select s.id as site_id, d.date
from sites s cross join
     (select distinct t.date from tasks) d left join
     tasks t
     on t.site_id = s.id and t.date = d.date
where t.site_id is null;

Если вы ищете только одну дату, тогда более простой запрос:

select s.*
from sites s
where not exists (select 1
                  from tasks t
                  where t.site_id = s.id and t.date = $date
                 );

Для нескольких дат первый способ проще - вы можете заменить подзапрос d списком дат, которые вас интересуют.

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