Подтвердить что ты не робот

Mysql "Где не в", используя два столбца

Хорошо, поэтому у меня есть одна временная таблица, которая содержит идентификатор пользователя и идентификатор taskID. Он называется CompletedTasks. У меня есть вторая таблица, содержащая userID и taskID. Он называется PlannedTasks.

Мне нужно получить список всех идентификаторов taskID, которые были завершены, но не запланированы. Итак, мне нужно как-то избавиться от завершенных задач со всеми строками, где оба PlannedTasks.userID != CompletedTasks.userID AND PlannedTasks.taskID != CompletedTasks.taskID.

Надеюсь, этот вопрос будет иметь смысл. Пожалуйста, дайте мне знать, если это неясно, и я объясню далее.

Спасибо за любые советы!

4b9b3361

Ответ 1

Вы можете использовать этот (более компактный синтаксис):

SELECT *
FROM CompletedTasks
WHERE (userID, taskID) NOT IN
      ( SELECT userID, taskID
        FROM PlannedTasks
      ) ;

или версия NOT EXISTS (которая, хотя и более сложная, должна быть более эффективной с соответствующими индексами):

SELECT c.*
FROM CompletedTasks AS c
WHERE NOT EXISTS 
      ( SELECT 1
        FROM PlannedTasks AS p
        WHERE p.userID = c.userID
          AND p.taskID = c.taskID
      ) ;

и, конечно, версия LEFT JOIN / IS NULL, которую @jmacinnes имеет в своем ответе.

Ответ 2

Это то, что вам нужно?

select ct.* from
completedTasks ct
left outer join plannedTasks pt on ct.taskId = pt.TaskId and ct.userId = pt.userId
where pt.taskId is null

Однако я согласен с комментарием - учитывая то, что мы знаем из вопроса, столбец состояния выглядит как лучшая схема, чем две таблицы.

Ответ 3

@ypercubeᵀᴹ Спасибо за совместное использование ниже упоминания запроса

SELECT * FROM CompletedTasks WHERE (userID, taskID) NOT IN
      ( SELECT userID, taskID FROM PlannedTasks) ;'

Моя проблема решена.