2016-12-13 6 views
0

Ich versuche eine Abfrage zu schreiben, um Zeilen so zu wählen, dass die Bedingung streng erfüllt ist. Ich denke, der beste Weg, um zu zeigen, was ich versuche, ist ein Beispiel.MySQL Wählen Sie Zeile mit "nur wenn" Bedingung

Angenommen, ich habe die folgende Tabelle

+------------+ 
| A_Table | 
+----+-------+ 
| id | value | 
+----+-------+ 
| 1 |  1 | 
| 2 |  1 | 
| 2 |  2 | 
| 3 |  1 | 
| 3 |  2 | 
| 3 |  5 | 
+----+-------+ 

Was ich möchte eine Abfrage, die die ID zurückgibt, die nur die angegebenen Werte übereinstimmt. Sagen wir zum Beispiel, ich möchte die ID mit Werten strikt in (1,2), id = 2 ist die einzige, die dies erfüllt. Obwohl id = 3 die Werte 1 und 2 hat, hat es nicht genau diese Werte (genau wie id = 1). Hier

ist die Abfrage, die ich kam mit ist

select id 
from A_Table a 
where value in (1,2) 
and not exists (
    select b.id 
    from A_Table b 
    where value not in (1,2) 
    and b.id = a.id 
); 

Aber das gibt sowohl 1 und 2, weil die in Betreiber erfüllt nur mit dem Wert 1 für id 1. Ich bin nicht sicher, wie um den "strikten" Teil durchzusetzen.

Antwort

1

würde ich dies mit Aggregation tun:

select a.id 
from a_table a 
group by a.id 
having sum(a.value = 1) > 0 and   -- id has value = 1 
     sum(a.value = 2) > 0 and   -- id has value = 2 
     sum(a.value not in (1, 2)) = 0; -- id has nothing else 
+0

Er y @Gordon, tolle Sachen! Ich muss noch etwas über diese Art der Verwendung von Spaltenvergleichen in der having-Klausel lernen. Solltest du nicht lieber count statt sum incase verwenden, negative Werte sind erlaubt? – Anand

+1

Es wird über einen booleschen Ausdruck summiert, so dass nur 1s oder 0s summiert werden, also keine Negative. (Bearbeiten: Ich habe es gerade mit count versucht, und es hat nicht funktioniert). – McAngus

0

Mein Vorschlag:

select id 
from A_table as a 
where exists (
    select 1 
    from A_Table 
    where value in (1, 2) 
    and id = a.id 
    ) 
and not exists (
    select 1 
    from A_Table 
    where value not in (1, 2) 
    and id = a.id 
    ) 
group by id 
Verwandte Themen