2011-04-06 70 views
0

我的表格有以下方式的條目。需要幫助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

回答

1

你可以用子查詢做

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

可能是:

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

0

什麼別人說,但與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

1

...且在又一個查詢 -

SELECT id FROM fruits 
    GROUP BY id 
    HAVING COUNT(IF(value = 'Apple', 1, NULL)) = 0; 
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解決方案的計劃和性能)。