mysql“Where not in”使用两列

时间:2011-12-08 17:31:08

标签: mysql

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

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

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

感谢您的任何提示!

4 个答案:

答案 0 :(得分:75)

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

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
      ) ;

当然是@jmacinnes在答案中的LEFT JOIN / IS NULL版本。

答案 1 :(得分: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

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

答案 2 :(得分:1)

@ypercubeᵀᴹ感谢您分享以下提及查询

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

我的问题解决了。

答案 3 :(得分:0)

第一个答案非常好,它确实对我有用,只是在PlannedTasks之后遗漏了“)”。 我需要清除一个表中的元素,而另一个表中的元素,所以...

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

这是我的代码:

$query_C_Ranking = sprintf("SELECT * 
                                FROM tblpinturas
                                WHERE (idCode) NOT IN 
                                        (SELECT idCode FROM tblranking)
                                ");