Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql“Where not in”使用两列_Mysql - Fatal编程技术网

mysql“Where not in”使用两列

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

我有一个包含userID和taskID的临时表。它被称为CompletedTasks。 我还有第二个表,其中包含userID和taskID。它被称为计划任务

我需要获取已完成但未计划的所有TaskID的列表。 因此,我需要以某种方式从已完成的任务中剔除所有行,其中:

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