mysql"Where not in"使用两列

PFr*_*ise 33 mysql

好的,所以我有一个包含userID和taskID的临时表.它被称为CompletedTasks.我有一个包含userID和taskID的第二个表.它被称为PlannedTasks.

我需要获取已完成但未计划的所有taskID的列表.所以,我需要以某种方式从已完成的任务中清除所有行PlannedTasks.userID != CompletedTasks.userID AND PlannedTasks.taskID != CompletedTasks.taskID.

我希望这个问题有意义.如果不清楚请告诉我,我会进一步解释.

谢谢你的任何提示!

ype*_*eᵀᴹ 79

您可以使用此(更紧凑的语法):

SELECT *
FROM CompletedTasks
WHERE (userID, taskID) NOT IN
      ( SELECT userID, taskID
        FROM PlannedTasks
      ) ;
Run Code Online (Sandbox Code Playgroud)

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
      ) ;
Run Code Online (Sandbox Code Playgroud)

当然还有LEFT JOIN / IS NULL@jmacinnes在他的回答中的版本.


jma*_*nes 5

这是你需要的吗?

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
Run Code Online (Sandbox Code Playgroud)

但是,我同意评论 - 鉴于我们从问题中知道状态列听起来比两个表更好的模式.