mysql - SQL SELECT 行,其中其他地方的列行为空

标签 mysql sql

首先,如果标题令人困惑,请见谅。
SQL 不是我的强项,我已经在这方面工作了一段时间,我现在的想法是连接,也许还有组。

索托示例:

record | type | key1  | key2    | data1
---------------------------------------
1      | 1    | joe   | smoe    | 10
2      | 2    | homer | simpson | 20
3      | 1    | null  | null    | 30
4      | 3    | bart  | simpson | 40 

其中主键由id、key1、key2组成。

我只想要“类型”行,其中 key1 不为空且 key2 不为空。

因为在记录 3 中,类型 1 具有空键,因此我希望所有类型 1 的记录不包含在派生表中。

最佳答案

这是一个相关的、“不存在”的方法:

select *
from T as t1
where not exists (
    select *
    from T as t2
    where t2.type = t1.type and (t2.key1 is null or t2.key2 is null)
)

这是一个使用非相关查询和分组的查询。也许这就是您的想法:

select *
from T as t1
where t1.type in (
    select t2.type
    from T as t2
    group by t2.type
    having count(*) = count(t2.key1) and count(*) = count(t2.key2)
)

自从我了解 mysql 查询计划可能对这些事情很敏感。这是与连接等效的:

select t1.*
from T as t1
    inner join
    (
        select t2.type
        from T as t2
        group by t2.type
        having count(*) = count(t2.key1) and count(*) = count(t2.key2)
    ) as goodtypes
        on goodtypes.type = t1.type

关于mysql - SQL SELECT 行,其中其他地方的列行为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12029127/

相关文章:

mysql - 在单个查询中选择昨天的最后一条记录和今天的所有记录

php - Mysql mysql_num_rows($result);备择方案

javascript - 我希望更新未读消息的数量,并在用户收到新消息时播放通知声音。我使用 PHP、MySql、Javascript

php - MySQL CGI 文件 500 内部服务错误

mysql - 无法应用安全设置,安装时用户 'root' @ 'localhost' 的访问被拒绝?

mysql - SQL 按计数过滤

mysql - SQL/Sybase 查询按列值的子字符串分组

mysql - 如何将不同 WHERE 条件下的数据排列到不同的列中?

mysql - 我可以在 GROUP BY 之前执行 COUNT()

php - 如何从 3 个字段(月、日、年)中获取值并将所有这三个字段作为单个字段插入(MySQL)?