mysql - 选择 none in set

标签 mysql sql

我有两个表:

Invariant (UniqueID, characteristic1, characteristic2)
Variant   (VariantID, UniqueID, specification1, specification2)

每个项目在实现之间都有自己不变的特征。每个实现也有自己的属性。

因此,我使用这样的查询来查找具有给定特征和规范的项目:

SELECT * 
FROM `Invariants` 
LEFT JOIN (`Variants`) ON (`Variants`.`UniqueID`=`Invariants`.`UniqueID`)   
WHERE char2='y' and spec1='x' 
GROUP BY `Invariant`.`UniqueID`;

我正在寻找一个查询,该查询将返回所有从未满足给定规范的项目。所以,如果项目 100 的变体之一有 spec1='bad' , 然后我不希望项目 100 被包括在内,不管它是否有 spec1='good' 的变体.

最佳答案

select *
from Invariants iv
where not exists (
    select 1
    from Variants v
    where v.UniqueId = iv.UniqueId and v.spec1 = 'bad'
)

下面的查询没有解决您的问题,我可能读得很快并且认为您只想获取特定类型的不变属性。但我会注意到,您不应该在 where 子句中使用左连接然后过滤右表中的列(检查空值除外)。人们总是会犯这样的错误,我第一眼就想到了这一点。

左联接的全部目的是某些行将不匹配,因此右侧表的列中将填充空值。此连接逻辑首先发生,然后在应用 where 子句之后发生。当您遇到类似 where spec1 = 'x' 的条件时,它总是会针对 null 值评估为 false。所以你最终删除了所有你想保留的行。

对于这些不变/自定义值表,这种情况经常发生。您只对其中一个属性感兴趣,但如果您在加入之前或在加入条件内不进行过滤,您最终会删除行,因为该值不存在并且您没有留下可比较一次的值它试图在属性名称上应用 where 子句条件。

希望这是有道理的。请参阅下面的示例:

select iv.UniqueId, ...
from
    Invariants iv left outer join
    Variants
        on v.UniqueId = vi.UniqueId and v.spec1 = 'x'

select iv.UniqueId, ...
from
    Invariants iv left outer join
    (    
        select
        from Variants
        where spec1 = 'x'
    ) v
        on v.UniqueId = vi.UniqueId

关于mysql - 选择 none in set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33022179/

相关文章:

sql - 查找序列中未缺失的列中的上一个数字

sql - DISTINCT 有两个 array_agg(或一个 array_agg 里面有元组)?

mysql - 使用外键将表拆分为两个表

php - 使用 PHP 的 mysqli 执行准备好的语句的正确和最简单的方法是什么?

php - 数据未进入表(mySQL)(没有出现错误)

mysql - 是否可以使此查询正常工作?

MySQL 局部变量

mysql - 根据任意列插入或更新

c# - 我们还需要在 C# 代码和存储过程中应用 Sql Transaction 吗?

mysql - 动态选择哪个表