Komplexe SQL-Abfrage mit mehreren Tabellen und Beziehungen

8

In dieser Frage muss ich ein Spielerpaar mit seiner playerID und playerName auflisten, die für die gleichen Teams spielen. Wenn ein Spieler für 3 Mannschaften spielt, muss der andere für genau 3 gleiche Mannschaften spielen. Nicht weniger, nicht mehr. Wenn zwei Spieler derzeit nicht für ein Team spielen, sollten sie ebenfalls berücksichtigt werden. Die Abfrage sollte zurückgeben (playerID1, playername1, playerID2, playerName2) ohne Wiederholung, wie wenn Player 1 Info vor Player 2 kommt, es sollte kein weiteres Tupel mit Player 2 Informationen vor Player 1 geben.

Wenn zum Beispiel Spieler A für Yankees und Redsox spielt und Spieler B für Yankees, Red Sox und Dodgers spielt, sollte ich sie nicht bekommen. Sie müssen beide für Yankees und Red Sox spielen und sonst niemand. Im Moment findet diese Abfrage eine Antwort, wenn Spieler für dasselbe Team spielen.

%Vor%

Also sollte ich das als Antwort bekommen -

%Vor%

.

2, Allen, 3 Pierce ist ein Snwer, weil beide exklusiv für CELTICS und PATRIOTS spielen  4, Garnett, 5, Perkins ist eine Antwort, weil beide Spieler für keine Teams spielen, die in der Ausgabe sein sollten.

Im Moment ist die Abfrage, die ich habe,

%Vor%

Ich bin mir nicht 100% ig sicher, aber ich denke, dass dies Spieler findet, die für dasselbe Team spielen, aber ich möchte Spieler finden, die für die ausschließlich gleichen TEAMS wie oben erklärt spielen

Ich stehe fest darauf, wie ich danach vorgehen soll. Hinweise, wie Sie dieses Problem angehen können. Vielen Dank für Ihre Zeit.

    
user2632133 31.07.2013, 06:44
quelle

16 Antworten

4

Ich glaube, diese Abfrage wird tun, was Sie wollen:

%Vor%


%Vor%

Er verwendet array_agg über die Teamid für jeden Spieler in plays , um Spieler mit genau der gleichen Teamkonfiguration zu erreichen. Ich habe beispielsweise eine Spalte mit den Teams eingeschlossen, die aber entfernt werden kann, ohne die Ergebnisse zu beeinflussen, solange sie nicht aus der group by-Klausel entfernt wird.

SQL Fiddle-Beispiel. Getestet mit Postgesql 9.2.4

BEARBEITEN: Ein Fehler, der Zeilen dupliziert, wurde behoben.

    
jpw 31.07.2013 08:31
quelle
1

Scheint, dass OP wahrscheinlich nicht mehr interessiert sein wird, aber falls jemand anderes es nützlich findet, das ist eine Abfrage in reinem SQL, die funktioniert (zumindest für mich;))

%Vor%     
janek 09.11.2013 22:47
quelle
1

es ist keine große Sache, hier ist die Lösung

%Vor%     
ish 16.01.2014 07:11
quelle
1

Diese Lösung funktioniert für mich:

%Vor%     
Amogh Huilgol 11.05.2015 05:41
quelle
0

Zwei mögliche Lösungen kommen mir in den Sinn:

  1. Cursor - Durchstreife jeden Spieler und vergleiche ihn mit allen anderen bis zum Schluss.
  2. Rekursive Abfrage - Gleiche Idee, obwohl etwas komplizierter, aber trotzig der bessere Weg, dies zu tun. Hat wahrscheinlich auch bessere Leistung.

Können Sie einige Beispieldaten bereitstellen, damit ich ein Beispiel erstellen kann?

    
Gidil 31.07.2013 07:02
quelle
0

Es scheint, als wäre der grundlegende Datentyp, den Sie wollen, Sets und nicht Arrays. Eine Option könnte also die Verwendung von PL / Python mit einem ähnlichen Code sein (siehe unten in dieser Antwort für eine Funktion, die zu diesem Zweck angepasst werden könnte). Natürlich ist dies kein "reiner SQL" Ansatz.

Aber bei PostgreSQL (wenn auch nicht standard SQL), möchten Sie vielleicht auch DISTINCT mit array_agg verwenden. Beachten Sie, dass das folgende nur das erste Paar gibt, das die Kriterien erfüllt (im Prinzip könnte es viel mehr geben).

%Vor%

Die obige Abfrage liefert die folgende Ausgabe:

%Vor%

Beispiel PL / Python-Funktionen:

%Vor%

Version des obigen Codes, der diese Funktionen verwendet (die Ausgabe ist ähnlich, aber dieser Ansatz wählt alle Paare aus, wenn es mehr als eins für eine bestimmte Gruppe von Teams gibt):

%Vor%     
Ian Gow 31.07.2013 17:09
quelle
0

Wir machen eine Abfrage mit der Anzahl der Teams pro Spieler und der Summe von ascii (team_name) + team_id nennen es team_value. Wir machen einen self join, der die selbe Abfrage mit sich selbst durchführt, wo counts und team_values ​​übereinstimmen aber id nicht gleich id sind, das gibt uns die ID's, die wir holen wollen

%Vor%     
rose 04.01.2014 13:43
quelle
0

Hier ist die einfache Abfrage mit UNION und 2-3 einfachen Joins. Die erste Abfrage vor UNION enthält den Spielernamen und die Spieler-ID, die für die gleiche Anzahl von Teams die gleiche Anzahl von Malen gespielt hat. Die zweite Abfrage nach UNION enthält den Spielernamen und die Spieler-ID, die für kein Team gespielt hat.

Kopieren Sie einfach diese Abfrage und versuchen Sie es auszuführen, Sie werden die erwarteten Ergebnisse sehen.

%Vor%     
user3796386 02.07.2014 06:02
quelle
0

Versuchen Sie Folgendes: Hier Test PLAYS Tabelle in Ihrer Frage.

%Vor%     
shruti 16.10.2014 18:54
quelle
0

Für jeden Interessierten funktioniert diese einfache Abfrage für mich

%Vor%     
Gautham Kumaran 28.12.2014 06:21
quelle
0

%Vor%
    
Furious Gul 04.03.2015 17:58
quelle
0
%Vor%     
user2457621 16.04.2015 10:59
quelle
0

Dies ist ANSI SQL, ohne spezielle Funktionen zu verwenden.

%Vor%     
Rohan Nayak 11.05.2015 05:58
quelle
0

Wenn Ihre teamId eindeutig ist, funktioniert diese Abfrage. Es identifiziert einfach alle Spieler, die die gleichen Teams haben, indem sie die Teamid summieren oder wenn der Spieler keine IDs hat, wird es null sein. Zählt dann die Anzahl der Spiele über Team Matches. Ich habe mit SQL Fiddle in Postgre 9.3 getestet.

%Vor%     
Doug 04.10.2015 02:50
quelle
-1

Diese Abfrage sollte es lösen.  Durch einen Self-Join auf PLAYS. - Vergleichen Sie auf der Spieler-ID - Vergleichen Sie die übereinstimmende Anzahl der Reihen mit der Gesamtzahl aller Spieler.

%Vor%
    
SNR 21.02.2015 19:22
quelle
-2

Erstellen Sie eine Funktion in SQl 2008

%Vor%

- Wählen Sie dbo.fngetTeamIDs (2)

Abfrage starten hier

%Vor%     
Akanksha 04.09.2015 11:34
quelle

Tags und Links