2016-05-14 10 views
0

Ich habe folgende Tabelle in meiner Datenbank:SQL - Tags Abfrage Suche

ID name 
1 x 
2 x 
3 y 
1 y 
1 z 

Jetzt habe ich nur diese Objekte (IDs) auswählen möchten, die sowohl ‚x‘ hat und ‚y‘ Wert s Tag-Namen. In diesem Fall wird dies nur mit ID = 1 aufgezeichnet, da die gesuchten Werte ('x' und 'y') Teilmenge dieses Datensatzes sind, der mit möglichen Namen ('x', 'y' und 'z') gesetzt wird.

Wie schreibe ich eine SQL-Abfrage?
Vielen Dank für Hilfe :)

Antwort

2

Ein Verfahren verwendet Aggregation:

select id 
from t tx join 
    t ty 
    on tx.id = ty.id and tx.name = 'x' and ty.name = 'y'; 

Die erste Version ist einfacher:

select id 
from t 
where name in ('x', 'y') 
group by id 
having count(*) = 2; 

Wenn Sie über die Leistung kümmern Sie dies vergleichen möchten auf weitere Tags verallgemeinern. Unter bestimmten Umständen könnte die zweite Leistung besser sein.

+0

Wahrscheinlich, im Falle der ersten Abfrage, sollte dies kein Problem sein, es sei denn 'Name' ist nicht eindeutig in Bezug auf' ID', aber es könnte ausgewählt werden, wenn die 'ID' mehrere derselben enthält Name'swert. Die zweite Abfrage wäre wahrscheinlich idealer. – gmiley

+0

DANKE viel! Es funktioniert :) – Wicia

+0

@gmiley. . . Wenn Duplikate ein Problem darstellen, verwenden Sie einfach "count (distinct name) = 2". Die Beispieldaten weisen nicht darauf hin, dass Duplikate ein Problem darstellen. Wenn "name" auch "NULL" sein könnte, müsste das OP erklären, wie mit diesen Werten umzugehen ist. –