Mysql 是否有“nothave”语法,如“WHERE XXX NOT IN”? 我有几个查询获取将来将被删除的行的ID号。 行号被放入一个字符串中,并放在下面的查询中,您将看到2。

Mysql 是否有“nothave”语法,如“WHERE XXX NOT IN”? 我有几个查询获取将来将被删除的行的ID号。 行号被放入一个字符串中,并放在下面的查询中,您将看到2。,mysql,where-clause,having-clause,Mysql,Where Clause,Having Clause,我希望结果忽略这些行,就像它们已经被删除一样 SELECT MAX(T1.id) AS MAXid FROM transactions AS T1 WHERE id NOT IN ( 2 ) GROUP BY T1.position ORDER BY T1.position 我的猜测是我需要用have替换WHERE行,但是我找不到have语法 按照当前编写此查询的方式,如果WHERE子句中列出了T1.position的max id,则不会返回该位置的行 我如何让这个查询为我提供T1.1位

我希望结果忽略这些行,就像它们已经被删除一样

SELECT MAX(T1.id) AS MAXid
FROM transactions AS T1 
WHERE id NOT IN ( 2 ) 
GROUP BY T1.position 
ORDER BY T1.position
我的猜测是我需要用have替换WHERE行,但是我找不到have语法

按照当前编写此查询的方式,如果WHERE子句中列出了T1.position的max id,则不会返回该位置的行

我如何让这个查询为我提供T1.1位置的最大ID 忽略WHERE子句中列出id的行时?

id不在2中的行应该有效;[NOT]IN不限于WHERE子句。

您是否尝试了

SELECT MAX(t1.id) AS MAXid 
FROM transactions t1 
WHERE id  <> ANY (2) 
GROUP BY t1.position ORDER BY t1.position

具有的有效语法如下所示

SELECT MAX(T1.id) AS MAXid
FROM transactions AS T1 
GROUP BY T1.position 
HAVING MAX(T1.id) NOT IN ( 2 ) 
ORDER BY T1.position

拥有并不是你所需要的-它只在你想按最大值过滤时才有用。例如,如果你不想得到所有的MAXid,而只想得到那些大于2的MAXid,你可以使用MAXid>2

据我所知,您希望忽略一些行并计算其余行的MAXid。为此,我认为你的说法是正确的。如果您的not in子句中提到了一个职位的所有ID,那么该职位不会列在结果集中。这是合理的,因为您无法计算最大值。如果某个职位的某些ID列在“不在”中,而其他ID则未列在“不在”中,则应获取未列在“不在”中的ID的最大值


如果结果集与这些表达式不匹配,则应调试插入到not IN中的字符串-可能它意外包含了太多ID。

我满怀希望,然后我发现SQL语法中有错误。错误消息。简单地将WHERE改为have不起作用:将WHERE替换为HAVING不起作用,因为HAVING不能出现在GROUP BY之前。@DrownedShelp-出现错误的原因是您将HAVING放在GROUP BY和ORDER BY之前。它应该在查询的末尾。@Galz在我的例子中,having子句必须放在GROUP BY和ORDER BY之间才能使它全部工作。我在这一个上也有语法错误。我试着在数字周围加上单引号以防万一。对我来说没有任何效果。如果只有一个数字,那么就不需要添加',许多ID都在那里,然后使用'like'2','3'ANY需要一个子查询,这就是语法错误的原因。如果要使用子查询,可能需要使用ALL而不是ANY。ANY检查子查询的结果集中是否至少有一个条目与id不同-这对您的用例毫无意义。如果您使用诸如WHERE id all SELECT'2'from transactions之类的子查询,它应该与all一起工作,但与not in相比,我看不到任何收益。如果您的位置具有id 0、1和2,此查询将完全忽略它,因为MAXT1.id不在2中不匹配。如果忽略2,它将不会返回最大id 1。我的答案只是have的语法。我不是在解释这个问题,这个问题不太清楚。在您的示例中,OP可能会问,因为maxid 2已经标记为删除,所以不要添加另一个maxid 1。titanoboa清楚地理解我要做的事情。我同意他的回答,他的回答支持我最初的质疑,但我没有得到预期的行为。如果你没有得到预期的行为,你的质疑是错误的。对于IN2,如果一个位置的id值为0、1、2,并且希望选择id 1,则使用语法正确的查询。如果您不想要id 1,那么使用带有have的查询。我同意我的语法是正确的。我得到结果1。获取所有最大ID 2。然后排除不在中的项目。希望你能看到这是正确的。我想要的是1。省略NOT in中的所有ID。2.获取每个位置的最大ID。这两个概念不一样。我已经成功地为前一个概念编写了查询。我的问题是如何为后一个概念编写查询?不能简单地用have替换WHERE。HAVING子句应该出现在查询中的其他位置—GROUP BY和ORDER BY之后。但是——正如泰坦黑猩猩所说,我不确定你想要的是什么。所以我投他的票!您应该调试插入NOT IN的字符串-可能它意外地包含了太多ID。我100%同意您的答案,这就是我以这种方式编写查询的原因。然而,我没有得到预期的行为。相反,它[省略MAXid在NOT in中的任何位置。]您的建议调试插入NOT in中的字符串-可能它意外地包含了太多的id。这不适用。我为单元测试运行的实际查询如上图所示,只有一个id可以省略。注意:T1.position确实有另一个id=1的行,我希望在结果集中得到它。