Mysql "Где не в", используя два столбца
Хорошо, поэтому у меня есть одна временная таблица, которая содержит идентификатор пользователя и идентификатор taskID. Он называется CompletedTasks. У меня есть вторая таблица, содержащая userID и taskID. Он называется PlannedTasks.
Мне нужно получить список всех идентификаторов taskID, которые были завершены, но не запланированы. Итак, мне нужно как-то избавиться от завершенных задач со всеми строками, где оба PlannedTasks.userID != CompletedTasks.userID AND PlannedTasks.taskID != CompletedTasks.taskID
.
Надеюсь, этот вопрос будет иметь смысл. Пожалуйста, дайте мне знать, если это неясно, и я объясню далее.
Спасибо за любые советы!
Ответы
Ответ 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) ;'
Моя проблема решена.