2016-08-16 32 views
0

比方說,我有這樣的取得不值的所有行,而不子查詢

Id item_id type_id  date 
1  1   1    2016-08-11 
2  2   2    2016-08-12 
3  2   3    2016-08-13 
4  3   4    2016-08-14 
5  4   3    2016-08-15 
6  2   3    2016-08-16 

的桌子,你可以看到,我有一個ID爲2有2種(TYPE_ID 2和3)項。如何獲取不是3類的所有項目(item_id)而不使用子查詢。例如預期的結果應該是:

Id item_id type_id  date 
1  1   1    2016-08-11 
4  3   4    2016-08-14 

如果我寫了下面的SQL語句:

SELECT * FROM my_table WHERE type_id <> 3 GROUP BY item_id; 

上述聲明回報也是2型(因爲它在表中的行,這也是不類型3)。

請任何幫助。

+1

與該表數據,什麼是預期的結果? – jarlh

+0

你到底在找什麼? 「所有不屬於3類的項目」 - 在這種情況下,您不需要GROUP BY子句,是嗎?我錯過了什麼? – WillardSolutions

+0

很容易看到他想做什麼..唯一的問題是沒有子查詢如果他想要所有字段,而不僅僅是item_id – JamieD77

回答

1

,你可以指望的次數的ITEM_ID有3 TYPE_ID,只選擇那些具有0

SELECT `Id`, `item_id`, `type_id`, `date` 
FROM MyTable 
GROUP BY item_id 
HAVING COUNT(CASE WHEN type_id = 3 THEN 1 
       END) = 0 

SQL FIDDLE EXAMPLE

計數要知道,如果你有一個以上的記錄對於每個item_id,通過item_id進行的分組只會爲您提供結果中的其中一條記錄。

+0

我確實需要每條item_id 1條記錄。這就是爲什麼我做GROUP BY item_id。你的答案似乎有效。我只是不理解CASE部分... – user765368

+0

問題在於,即使每個組可以有多個類型爲<> 3的項目,每個組也只會得到一行。 – shawnt00

+0

沒關係,每組item_id都有一行(這就是我所需要的)。 – user765368

1
SELECT DISTINCT t1.* 
FROM 
    my_table t1 
    LEFT JOIN my_table t2 
    ON t1.item_id = t2.item_id 
    AND t2.type_id = 3 
WHERE 
    t2.id IS NULL 

如果ITEM_ID到TYPE_ID組合從來沒有完整地複述您不需要DISTINCT

SQL撥弄證明它的工作原理http://sqlfiddle.com/#!9/c49e1d/4/0

+0

我說沒有子查詢 – user765368

+0

我懷疑這是不可能的 – user765368

+0

好吧,所以我有一個時間:)我通常喜歡自我加入,所以可能人們用IN和Exists回答這個網站它已經改變了我的想法.. 。 – Matt

相關問題