2016-08-16 7 views
0

Lasst uns sagen, dass ich wie diesesErhalten Sie alle Zeilen von NOT Wert OHNE Unterabfrage

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 

eine Tabelle Wie Sie sehen können, ich habe Artikel mit id 2, die 2 Typen (type_id 2 und 3). Wie bekomme ich alle Elemente (item_id), die NICHT von Typ 3 OHNE Unterabfragen sind. Zum Beispiel sollte das erwartete Ergebnis sein:

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

Wenn ich schreibe die folgenden SQL-Anweisung:

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

Die obige Anweisung gibt auch Typen 2 (weil es eine Zeile in der Tabelle, die auch ist, hat nicht vom Typ 3).

Jede Hilfe bitte.

+1

Mit dieser Tabelle Daten arbeitet, was ist das erwartete Ergebnis? – jarlh

+0

Was genau suchen Sie? "alle Elemente, die nicht vom Typ 3 sind" - in diesem Fall brauchen Sie die GROUP BY-Klausel nicht, oder? Was vermisse ich? – WillardSolutions

+0

Es ist einfach zu sehen, was er tun will .. das einzige Problem ist, es ohne eine Unterabfrage zu bekommen, wenn er alle Felder und nicht nur die item_id – JamieD77

Antwort

1

Sie zählen, wie oft kann ein item_id eine type_id von 3 hat und nur diejenigen mit einer Zählung von 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 
wählen

SQL FIDDLE EXAMPLE

nur bewusst sein, dass, wenn Sie mehr als einen Datensatz Für jede item_id gibt diese Gruppierung nach item_id nur einen der Datensätze in Ihrem Ergebnis.

+0

Ich möchte 1 Datensatz pro item_id. Deshalb mache ich die GROUP BY item_id. Ihre Antwort scheint zu funktionieren. Ich verstehe nur nicht den CASE-Teil ... – user765368

+0

Das Problem wird sein, dass Sie nur eine Zeile pro Gruppe erhalten, obwohl Sie mehr als ein Element des Typs <> 3 pro Gruppe haben können. – shawnt00

+0

Es ist in Ordnung, eine Zeile pro Gruppe von item_id (das ist was ich brauche) zu haben. – 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 

Wenn item_id Kombination type_id nie Wiederholungen brauchen Sie nicht DISTINCT

SQL Geige erweist es http://sqlfiddle.com/#!9/c49e1d/4/0

+0

Ich sagte NO SUB QUERIES – user765368

+0

Ich bezweifle, dass dies unmöglich ist – user765368

+0

Okay, so hatte ich einen duh Moment :) Ich mag normalerweise die Self-Joins, so dass die Leute mit IN antworten und auf dieser Seite hat es mein Denken geändert .. – Matt

Verwandte Themen