为什么这些查询会产生不同的结果?

5
我运行了两个看起来做同样事情的查询,但结果不同:
SELECT COUNT(stage1) AS total 
FROM progress_status 
WHERE stage1 = 3 
AND stage2 != 3 AND stage3 !=3 AND stage4 !=3 AND stage5 !=3;

# total = 90

SELECT COUNT(stage1) AS total 
FROM progress_status 
WHERE stage1 = 3 
AND (stage2,stage3,stage4,stage5) != (3,3,3,3)

# total = 314

你刚刚提出了一个毫无根据的断言,并问为什么它不成立。我们需要更多了解你的假设以及你为什么会得出这样的结论。 - Lightness Races in Orbit
@TomalakGeret'kal 在评论之前应该先看看答案。他说得很对,这是一个好问题。 - Ariel
@Ariel:这是一个修辞性评论,基于问题本身而不考虑答案。这个问题缺乏足够的细节来被认为是“好”的,而且它没有明确表述(尽管在这种情况下,你是对的,他的意图可以被大部分猜测出来,但这不是重点)。我试图教导OP写出像“我期望X因为Y,但我看到了Z。为什么?我能看到X吗?Y有什么问题吗?”这样的东西,而不仅仅是“bluerueghlrgh”。 - Lightness Races in Orbit
@TomalakGeret'kal 对不起,我不明白你看不到什么。对我来说,这个问题非常清楚。也许是因为我已经知道这些元组比较的工作方式。 - Ariel
@Ariel:这与主题无关!这是关于问题质量的问题。有一个不合逻辑的断言(“它们看起来像做同样的事情,但给出不同的结果”?!),没有进一步的推理或评论,使这成为一个形式不良的问题。 - Lightness Races in Orbit
3个回答

5
第二种方法是执行以下操作:
AND (stage2 != 3 OR stage3 !=3 OR stage4 !=3 OR stage5 !=3);

你能提供一份文档的参考来支持这个说法吗?目前这只是另一个断言。 - Lightness Races in Orbit
不,我找了很长时间也没有找到。据我所知,它没有文档记录(尽管我记得在某个地方读到过,只是找不到了)。我发现论坛上有人询问文档,回答是“没有”。最接近的资料是http://dev.mysql.com/doc/refman/5.0/en/any-in-some-subqueries.html,它处理子查询,所以并不完全相同,但基本上这些类型的表达式使用“ANY”运算符。如果你需要搜索关键字,它被称为元组比较 - 有很多stackoverflow线程,但我没有找到任何官方资料。 - Ariel
请问有权威的文档可以解释 "expr {$var}" 语法的含义吗? - Lightness Races in Orbit
@TomalakGeret'kal 大奖!http://dev.mysql.com/doc/refman/5.0/en/row-subqueries.html - 你激励我继续寻找 :) - Ariel
但是那个页面上写的是“AND”,而不是“OR”。 - Lightness Races in Orbit

3

很正常:

  • 您的第一个查询要求所有阶段列都与3不同
  • 您的第二个查询要求这些列不同时不等于3,因此如果有一个不同于3的记录将被取出! 这个查询就像在WHERE子句中使用了OR

2
stage2 != 3 OR stage3 !=3 OR stage4 !=3 OR stage5 !=3时,(stage2,stage3,stage4,stage5) != (3,3,3,3)为真。请注意保留HTML标签,不做任何解释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接