SQL: Wie man eine einzelne ID ("Zeile") auswählt, die mehrere Kriterien aus einer einzelnen Spalte erfüllt
Ich habe einen sehr schmalen Tisch: user_id, Abstammung.
Die user_id-Spalte ist selbsterklärend.
Ist die Abstammung Spalte enthält das Land, in dem der Benutzer die Vorfahren der Hagel.
Einem Benutzer können mehrere Zeilen der Tabelle, so kann ein Benutzer haben Vorfahren aus mehreren Ländern.
Meine Frage ist: wie wähle ich den Benutzer aus, deren Vorfahren stammen aus mehreren, festgelegten Ländern?
Z.B. zeige mir alle Benutzer mit Vorfahren aus England, Frankreich und Deutschland, und-Rückgabe 1 Zeile pro Benutzer, dass die Kriterien erfüllt werden, dass.
Was ist SQL?
user_id ancestry
--------- ----------
1 England
1 Ireland
2 France
3 Germany
3 Poland
4 England
4 France
4 Germany
5 France
5 Germany
Bei den Daten oben, würde ich erwarten, dass das Ergebnis "4" user_id 4 hat Vorfahren aus England, Frankreich und Deutschland.
Vielen Dank im Voraus.
P. S. Zu klären: ja, der user_id /Abstammung Spalten einzigartig machen-pair-Mädchen, so ein Land würde nicht wiederholt werden, für einen bestimmten Benutzer.
P. P. S. ich bin auf der Suche für die Benutzer kommen aus allen 3 Ländern - England, Frankreich UND Deutschland (und die Länder willkürlich sind).
P. P. P. S. ich bin nicht auf der Suche nach Antworten, die spezifisch für eine bestimmte RDBMS. Ich bin um eine Antwort auf dieses problem "im Allgemeinen."
Ich bin sehr zufrieden w, regeneriert die where-Klausel für jede Abfrage, sofern die Generierung der where-Klausel können programmgesteuert ausgeführt werden (z.B. dass ich bauen kann, eine Funktion zu erstellen die WHERE /FROM - WHERE-Klausel).
InformationsquelleAutor der Frage W. Young | 2011-08-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie dies:
Die Letzte Zeile bedeutet, dass der Benutzer der Abstammung hat alle 3 Länder.
InformationsquelleAutor der Antwort Hong Ning
InformationsquelleAutor der Antwort HuckIt
Benutzer eine 3-Länder
Benutzer alle 3 Ländern
InformationsquelleAutor der Antwort Chains
einen der Ansatz, wenn Sie wollen, um alle user_id, erfüllt alle Bedingungen:
etc. Wenn Sie brauchen, um alle user_ids erfüllt, dass mindestens eine Bedingung, dann können Sie
Ich bin nicht bewusst, wenn es etwas ähnlich, aber zwischen den Bedingungen mit UND statt ODER
InformationsquelleAutor der Antwort mkk
brute-force (und nur getestet auf einem Oracle-system, aber ich denke, das ist ziemlich standard):
edit: ich mag @HuckIt Antwort noch besser.
InformationsquelleAutor der Antwort StevenV
Erste Möglichkeit: JOIN:
Leute mit mehreren Ländern:
Menschen aus 2 bestimmten Ländern:
3 Länder... verbinden Sie drei mal. Um nur das Ergebnis zu erhalten(s) einmal, deutlich.
Zweite Möglichkeit: GROUP BY
Diese erhalten Benutzer, die 3 Linien (...) rechnen und dann geben Sie an, welche Zeilen sind erlaubt. Beachten Sie, dass wenn Sie nicht über einen EINDEUTIGEN SCHLÜSSEL auf
(user_id, ancestry)
ein Benutzer mit der Kennung 'id, england", erscheint 3-mal wird auch passen... also es kommt auf deine Tabellenstruktur und/oder Daten.InformationsquelleAutor der Antwort Konerak
Diese Frage ist einige Jahre alt, aber ich kam über ein Duplikat. Ich möchte vorschlagen, eine Allgemeine Lösung zu. Wenn Sie wissen, dass Sie immer eine Feste Anzahl von Vorfahren, die Sie verwenden können, einige selbst schließt, wie schon vorgeschlagen, in die Antworten. Wenn Sie möchten, dass ein generischer Ansatz gehen Sie auf Lesen.
Was Sie brauchen, ist hier als Quotient in der relationalen Algebra. Der Quotient ist mehr oder weniger die Umkehrung der Kartesisches Produkt (Cross Join in SQL).
Lassen Sie uns sagen, dass Ihre Vorfahren legen Sie
A
ist (ich benutze eine Tabelle notation hier, ich glaube das ist besser für das Verständnis)sowie Ihre Benutzer-set
U
istDas kartesische Produkt
C=AxU
ist dann:Wenn Sie die Ermittlung der Satz-quotient
U=C/A
dann erhalten SieWenn Sie wiederholen das kartesische Produkt
UXA
erhalten SieC
wieder. Aber beachten Sie, dass für eine ReiheT
,(T/A)xA
wird nicht unbedingt reproduzierenT
. Zum Beispiel, wennT
istdann
(T/A)
ist(T/A)xA
dannBeachten Sie, dass die Datensätze für
user_id=2
wurden beseitigt, indem die Differenz und Kartesisches Produkt Vorgänge.Ihre Frage ist: Welche user_id hat Vorfahren aus allen Ländern in Ihren Vorfahren gesetzt? In anderen Worten, Sie wollen
U=T/A
woT
ist dein original-Satz (oder der Tisch).Zur Umsetzung der quotient in SQL-Sie haben zu tun 4 Schritte:
alle user_ids.
Also machen wir es Schritt für Schritt. Ich werde TSQL-syntax (Microsoft SQL server), es sollte aber leicht anpassbar sein, um auch andere DBMS. Als Namen für die Tabelle
(user_id, ancestry)
ich wählenancestor
1) Erstellen Sie das kartesische Produkt Ihrer Abstammung Satz und der Satz von alle user_ids.
2) Finde alle Datensätze in das kartesische Produkt, die haben keinen partner in das original-set (Left Join) und
3) Extrahieren Sie die user_ids aus der Ergebnismenge von 2)
4) gib alle user_ids aus dem original-set sind nicht im Ergebnis enthalten 3)
InformationsquelleAutor der Antwort Martin K.