我无法让查询正常工作。我觉得这应该很容易,但由于某些原因我无法正确理解。
我有两个由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的输入获得与第一个相同的结果。
有什么想法吗?
答案 0 :(得分:1)
您的工作示例意味着"第一个表"你想看到来自a
和"第二张表"的记录。您要用于排除记录的是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,则此查询也会返回这些行,而不仅仅是第一个查询返回的行。