2014-10-08 102 views
0

我在查询正常工作时遇到问题。我觉得这应该很容易,但由于某种原因,我无法正确理解。MYSQL - 不等于不能正常工作

我有两个表加入了一个ID字段。我试图获取所有在t1中的记录,并且不会在t2中显示。

此工程目前:

select * from at_templates a 
left join at_vault b on a.id = b.template 
where b.at_id is null 

但是,我也希望把另外一个条件查询到的数据限制为一个子集,它不工作:

select * from at_templates a 
left join at_vault b on a.id = b.template 
where b.at_id != 1 

第二个查询基于at_id的输入,我想要得到与第一个相同的结果。

任何想法?

+1

目前还不清楚“基于at_id的输入”的结果与第一个结果相同。你似乎在说你想要一个将返回第一个查询得到的结果子集的查询。你不能通过在b.at_id上添加一个附加条件来做到这一点(因为当前的已经是可选择的)或者通过改变当前的条件(因为那样你就不会获得子集)。 – 2014-10-08 21:23:17

回答

1

你的工作示例意味着“第一表”你想看到的记录是从a和“第二台”您要使用排除记录是b。如果您是,但不包括b中存在的所有记录,则不能进一步限制结果集的值,例如b.at_id,因为在结果集中没有与b关联的值。

此外,如果条件b.at_id is null为真,则条件b.at_id != 1永远不会成立,因为an inequality comparison with null will always return null。 (这样做的原因是,null不是一个值;它是表示一个值的没有的占位符。)

如果你想从两个查询相同的结果,根据一些用户之间的比较输入参数和字段b.at_id(并指出,你的第二个查询目前返回一个空集),你也许可以通过以下方式使用MySQL's null-safe equality operator

SELECT 
    * 
FROM 
    at_templates AS a 
    LEFT JOIN 
    at_vault AS b ON a.id = b.template 
WHERE NOT b.at_id <=> 1; 

这是一个MySQL扩展,而不是标准的语法;不幸的是,ANSI SQL标准语法IS [NOT] DISTINCT FROM似乎并未得到广泛支持。 How to rewrite IS DISTINCT FROM and IS NOT DISTINCT FROM?讨论了一些替代方法来重写这种情况。请注意,如果将来您有一些不是1的值b.at_id,那么此查询也会返回这些行,而不仅仅是第一个查询返回的行。