好的,所以我有一个包含userID和taskID的临时表。它被称为CompletedTasks。我有一个包含userID和taskID的第二个表。它被称为PlannedTasks。
我需要获取已完成但未计划的所有taskID的列表。所以,我需要以某种方式从完成的任务中清除所有行PlannedTasks.userID != CompletedTasks.userID AND PlannedTasks.taskID != CompletedTasks.taskID
。
我希望这个问题有意义。如果不清楚,请告诉我,我会进一步解释。
感谢您的任何提示!
答案 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)
");