Mysql从集合中排除子集

时间:2015-03-27 14:22:09

标签: mysql

我试图解决这个问题已经有一段时间了,但无济于事!

问题
考虑下面给出的有几个子集(即3个子集)的集合:
Collection with 3 subsets

问题
无论如何我可以选择排除 SUB3?

我尝试过很多内容,例如:LEFT JOINJOINNOT INNOT EXISTS以及更多SELECT个子查询。

SELECT 
    t1.*, t2.*
FROM
    table AS t1
        LEFT JOIN
    table AS t2 ON t1.id = t2.id
WHERE
    t1.attribute = 'COLLECTION'
        AND t2.attribute = 'SUB3'
        AND oa2.id IS NULL;

注意
请注意,table包含大约7500万个条目(行),我希望能有一些快速的东西!

更新
示例

+-----+-------------+
| id  | attribute   |
+-----+-------------+
|  1  | vehicle     |
|  1  | bus         |
|  2  | vehicle     |
|  2  | car         |
|  3  | vehicle     |
|  3  | truck       |
+-----+-------------+  
Of course there is a second incremental id to avoid duplicate issues!

因此在这个例子中,我想要除truck之外的所有车辆!

请告知,
感谢

2 个答案:

答案 0 :(得分:1)

如果您想获得没有id的{​​{1}},那么您可以使用attribute = 'SUB3'group by来解决此问题:

having

select t.id from table t where t.attribute = 'COLLECTION' group by t.id having sum(t.attribute = 'COLLECTION' AND t.attribute = 'SUB3') = 0 子句是可选的,但它可以提高性能。

答案 1 :(得分:1)

使用NOT EXISTS删除所有不需要的元素

SELECT *
FROM table t
WHERE t.attribute = 'COLLECTION'
AND NOT EXISTS (    SELECT 'a'
                    FROM table t2
                    WHERE t2.id = t.id
                    AND t2.attribule = 'SUB3'
                )