首页 > 解决方案 > SQL 过滤掉具有多个值的 id

问题描述

我有以下格式的 MySQL 表

id     c1     c2
---------------------
id1    c1v1   c2v1  -> keep id1 even it has duplicates
id1    c1v1   c2v1
id2    c1v2   c2v2  -> filter out id2 because it has various c1, c2
id2    c1v2   c2v3
id3    c1v3   c2v4
....

预期输出:

id     c1     c2
---------------------
id1    c1v1   c2v1
id3    c1v3   c2v4
....

我只想保留 id 仅具有唯一 c1、c2 值的记录。我确实有一个解决方案,但它需要两次全表扫描,包括一个效率非常低的连接,我想知道是否有更好的方法来做到这一点。

select 
    distinct id, c1, c2
from table 
inner join 
    (select 
        id, 
        count(distinct c1, c2) as counts
    from table 
    group by id
    having counts = 1) tmp
on table.id = tmp.id

标签: mysqlsql

解决方案


您可以在不同的 c1/c2 值上使用 self 执行此操作,只保留第二个表LEFT JOIN中没有匹配行的那些行(即相同的不同值):id

SELECT DISTINCT t1.id, t1.c1, t1.c2
FROM test t1
LEFT JOIN test t2 ON t2.id = t1.id AND (t2.c1 != t1.c1 OR t2.c2 != t1.c2)
WHERE t2.id IS NULL

输出:

id      c1      c2
id1     c1v1    c2v1
id3     c1v3    c2v4

dbfiddle 上的演示


推荐阅读