需要帮助MySQL Query使用不像

问题描述:

我的表格有以下方式的条目。需要帮助MySQL Query使用不像

ID | Value 
---------- 
1 | Apple 
2 | Apple 
2 | Grape 

在这里,我想提取所有ID的不应有的苹果

现在,如果我们用不喜欢“苹果”的查询,那么我们将得到ID 2为葡萄是存在的。

所以我想知道是否有任何方法来提取ID不应该有苹果。

我不能使用子查询类的东西。 而主要的是在我们的应用程序中,我们使用这个查询作为通用的,意味着它应该支持所有的过滤器(Like,Not Like)。所以在这里我不能使用子查询。

在此先感谢。

+0

给一个不唯一的字段名称'ID'是不好的做法。 – Unreason 2011-04-06 08:37:19

你可以用子查询做

select id from table 
where id not in (
       select id from table 
       where value ='Apple' 
       ) 

可能是:

select * from dataTable where value not like 'Apple' and id not in(select id from datatable where value like 'Apple') 

但琢磨不同的值,重复的ID ...

+1

您不需要在外部查询 – 2011-04-06 08:04:34

+0

@Shakti中添加不像'Apple'的值,这确实是事实,但它可能会加快速度 - 允许查询规划人员执行执行操作,以便稍后删除某些记录需要使用更昂贵的(即使它不相关的子查询)不在 – Unreason 2011-04-06 08:16:04

+0

@不理由:添加更多不需要的条件。加快速度? – 2011-04-06 08:20:48

什么别人说,但与DISTINCT关键字,即:

select distinct id from table 
where id not in (
       select id from table 
       where value ='Apple' 
       ) 
+0

目前尚不清楚这是一条好路径。 DISTINCT的需求取决于未来数据的使用。是的,要获得适当的设置(无重复元素),您确实需要它。但是,DISTINCT很贵,不应该自动抛出(通常你会通过适当的设计避免它;在这种情况下,重复id的建议不好的设计和可能需要DISTINCT,但应该考虑通过) – Unreason 2011-04-06 08:21:26

...且在又一个查询 -

SELECT id FROM fruits 
    GROUP BY id 
    HAVING COUNT(IF(value = 'Apple', 1, NULL)) = 0; 

为了完整这里EXIST版本

SELECT id 
FROM table t 
WHERE NOT EXIST (
       SELECT 1 
       FROM table t2 
       WHERE value ='Apple' AND 
         t1.id = t2.id 
       ) 

(通常这些相关子查询执行差那么不相关对口,但情况因人而异根据数据模式,也索引可能使幅度差的订单,即使在小套)

编辑:

你也可以检查这个article看看这三种方法之间的相似之处和一些推理(虽然结论不一定适用于你的情况 - 你有一张表,但它显示了如何分析;尤其有趣的是比较Devart解决方案的计划和性能)。