MYSQL - 不等于连接不能正常工作

时间:2014-10-08 20:53:27

标签: 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 个答案:

答案 0 :(得分:1)

您的工作示例意味着&#34;第一个表&#34;你想看到来自a和&#34;第二张表&#34;的记录。您要用于排除记录的是b。如果您排除 b中存在的所有记录,则您无法通过b.at_id之类的任何值进一步限制结果集,因为是< / em>结果集中没有与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?中讨论了一些重写这种情况的替代方法。

请注意,如果将来您的某些b.at_id值不是1,则此查询也会返回这些行,而不仅仅是第一个查询返回的行。