mysql left join and not equals 应该只返回一行

Posted

技术标签:

【中文标题】mysql left join and not equals 应该只返回一行【英文标题】:mysql left join and not equals should return only one row 【发布时间】:2020-10-26 10:13:00 【问题描述】:

有人可以帮我查询以下要求吗?

对于上面的两个表,我在左连接查询下面写了

select distinct result 
from a 
    left join b on a.number = b.reference 
where a.color='red' and b.value != '10'

此查询返回 1 和 2 作为输出。

但我希望只有 2 作为输出,因为表 b 中的 list1 具有值:10,因此如果列表中的值匹配,则查询不应返回行。

【问题讨论】:

distinct 不是一个函数,它是一个 set-quantifier,适用于整个选定的行。跳过那些额外的括号,只需写 select distinct result from ... 以使代码更清晰。 您的查询的行为与指定的完全一样,因为它将表 a 中的 'red/list1' 行与表 b 中的所有 'list1' 行匹配(值 10 的行除外!)和同样,“red/list2”行将匹配表 b 中的所有“list2”行。因此,表 a 中的两个“红色”行在表 b 中都有多个匹配项,并且当您将 DISTINCT 应​​用于结果集时,您会同时返回 1 和 2。如果您尝试使用 SELECT * 而不是 SELECT DISTINCT RESULT 进行查询,那么应该清楚发生了什么。 见:Why should I provide an MCRE for what seems to me to be a very simple SQL query? 【参考方案1】:

可以使用left join 执行此操作。但过滤条件多在on子句中:

select a.result 
from a left join
     b
     on a.number = b.reference and b.value = '10'
where a.color='red' and b.reference is null;

【讨论】:

谢谢。这对我来说最有效,因为我有无法在查询中使用的现有连接查询【参考方案2】:

我了解您希望 a 中的“红色”行在 b 中与 value 10 不匹配。我认为用not exists 来表达更好:

select a.*
from tablea a 
where a.color = 'red' not exists (
    select 1
    from tableb b
    where b.reference = a.number and b.value = 10
)

【讨论】:

【参考方案3】:
select distinct(result) from a where color='red' and
number not in (select reference from b where value =10)

【讨论】:

【参考方案4】:
select result 
from a 
    left join b on a.number = b.reference AND b.value = 10
where a.color='red' and b.reference IS NULL

【讨论】:

以上是关于mysql left join and not equals 应该只返回一行的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 替换 LEFT JOIN 代替 NOT IN

MYSQL之not in优化方法:left join

LEFT JOIN ON AND 和LEFT JOIN ON WHERE区别

为什么 EXISTS(NOT EXIST) 与 JOIN(LEFT JOIN) 的性能会比 IN(NOT IN) 好

MySQL优化--NOT EXISTS和LEFT JOIN方式差异

MySql如何将LEFT JOIN查询与NOT IN查询结合起来