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
LEFT JOIN ON AND 和LEFT JOIN ON WHERE区别
为什么 EXISTS(NOT EXIST) 与 JOIN(LEFT JOIN) 的性能会比 IN(NOT IN) 好