mysql“Where not in”使用两列
我有一个包含userID和taskID的临时表。它被称为CompletedTasks。 我还有第二个表,其中包含userID和taskID。它被称为计划任务 我需要获取已完成但未计划的所有TaskID的列表。 因此,我需要以某种方式从已完成的任务中剔除所有行,其中:mysql“Where not in”使用两列,mysql,Mysql,我有一个包含userID和taskID的临时表。它被称为CompletedTasks。 我还有第二个表,其中包含userID和taskID。它被称为计划任务 我需要获取已完成但未计划的所有TaskID的列表。 因此,我需要以某种方式从已完成的任务中剔除所有行,其中: PlannedTasks.userID != CompletedTasks.userID 及 这是你需要的吗 select ct.* from completedTasks ct left outer join plannedT
PlannedTasks.userID != CompletedTasks.userID
及
这是你需要的吗
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
然而,我同意这一评论——根据我们从问题中了解到的情况,一个状态列听起来比两个表更好。您可以使用更简洁的语法:
SELECT *
FROM CompletedTasks
WHERE (userID, taskID) NOT IN
( SELECT userID, taskID
FROM PlannedTasks
) ;
或者是不存在的版本,虽然更复杂,但通过适当的索引应该更有效:
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
) ;
当然,左JOIN/是@jmacines在其答案中的空版本。@ypercubeᵀᴹ 谢谢分享下面提到的问题
SELECT * FROM CompletedTasks WHERE (userID, taskID) NOT IN
( SELECT userID, taskID FROM PlannedTasks) ;'
我的问题解决了。第一个答案很好,对我来说很有效,只是错过了一个计划后的任务。 我需要从一个表中删除另一个表中的元素,所以 挑选* 从已完成的任务 其中userID、taskID不在 选择用户ID、任务ID 来自计划任务 ; 这是我的代码:
$query_C_Ranking = sprintf("SELECT *
FROM tblpinturas
WHERE (idCode) NOT IN
(SELECT idCode FROM tblranking)
");
我认为您需要一个额外的列来指示状态,实际上不需要两个表。@ajreal这是一个很好的观点。也许我会考虑按照你建议的方式调整模式。谢谢你的提示!99%的情况下,我更喜欢两个表而不是一个表和一个状态列。以及一个表上的11个表和10个状态列。优化一个在MysQL中搜索一个或多个状态列的查询并不容易。太棒了!非常感谢你。我不知道你们可以用这种方式在两个领域使用Where,但我希望这将是一种选择。再次感谢您,祝您度过愉快的一天!根据我的测试,“不存在”版本比“不存在”版本快version@Ka. 是的,带元组的NOT IN没有像NOT EXISTS那样优化。你测试的是哪个版本?我还没有测试他们是否在新的5.7版本中改进了优化器。这应该是一个注释,而不是答案:实际上,我对@ypercube共享查询做了一些更改。将来会小心的。谢谢,我想这是最好的办法。这对我来说很好。谢谢状态栏可能会被忽略、不更新、设置为错误值等。这样的连接将提供所需的结果,而不管状态栏的状态如何。为了使SO平台正常工作,现有答案应该是上浮的,而不是重复的。如果有错别字,可以在帖子下方添加评论,也可以提出建议。SO平台的运作方式与论坛不同。但这是这个平台价值的一部分。每个平台都有自己的优势。此外,当引用另一篇文章Q或A时,它需要链接到,因为没有其他简单的方法来判断你引用的是哪篇文章。答案的顺序会随着答案的数量和每次投票的次数的变化而变化。它还取决于每个用户选择的排序顺序。
$query_C_Ranking = sprintf("SELECT *
FROM tblpinturas
WHERE (idCode) NOT IN
(SELECT idCode FROM tblranking)
");