2017-10-17 6 views
0

Ceci est une question de suivi à mon dernier Find all matches for given team in PostgreSQL.PostgreSQL Trouver tous les résultats pour donné joueur

Voici ma structure de données. J'ai players

uuid | first_name | last_name 
-----| -----------| --------- 
... | hard  | hitter 
... | big  | blocker 
... | super  | setter 

Deux joueurs forment une équipe dans mon teams tableau

uuid | player_1_uuid | player_2_uuid 
-----|---------------|-------------- 
729..| f432f7bc-63...| e022ccb6-7... 
d0f..| c9548a8e-b7...| a28441cb-2... 
... | ...   | ... 

Et deux équipes jouent les uns contre les autres dans un match stocké dans ma table matches.

uuid | name | team_a_uuid | team_b_uuid 
-----|------|-------------|------------ 
d7e..| foo | 5db46a15-...| 82732895-.. 
334..| bar | 75ab1a39-...| 9fcedf80-.. 
... | ... | ...   | ... 

Dans ma question précédente, j'ai demandé à obtenir une équipe et tous les UUID match qu'il a joué dans Voici une solution

select t.*, 
    (select array_agg(m.uuid) 
    from matches m 
    where t.uuid in (m.team_a_uuid, m.team_b_uuid) 
    ) as match_uuids 
from teams t; 

Maintenant, je voudrais aller un peu plus loin. Donnez moi un joueur et le match uuids il a joué. C'est un peu plus compliqué parce que nous devons obtenir les équipes d'abord, puis les matches. Je voudrais obtenir quelque chose comme ceci

uuid | first_name | last_name | team_uuids | match_uuids 
-----| -----------| ----------|---------------|--------------- 
... | hard  | hitter | {'...', '...'}| {'...', '...'} 
... | big  | blocker | {'...', '...'}| {'...', '...'} 
... | super  | setter | {'...', '...'}| {'...', '...'} 

Des idées?

Répondre

1

Je ne pouvais pas courir en fait la requête (pas de tables réelles pour tester) mais il devrait être quelque chose comme ceci:

SELECT 
    players.uuid, 
    players.first_name, 
    players.last_name, 
    array_agg(teams.uuid) AS team_uuids, 
    array_agg(matches.uuid) AS match_uuids 
FROM 
    players 
    JOIN teams 
    ON (players.uuid = teams.player_1_uuid OR players.uuid = teams.player_2_uuid) 
    JOIN matches 
    ON (teams.uuid = matches.team_a_uuid OR teams.uuid = matches.team_b_uuid) 
GROUP BY 
    players.uuid, 
    players.first_name, 
    players.last_name; 

Je suppose que, dans la clause GROUP BY la colonne players.uuid est suffisante si elle est la clé primaire - vous pouvez essayer de supprimer les colonnes players.first_name et players.last_name.

+0

Cela fonctionne :) Merci! Je reçois des UUID en double dans 'team_uuids'. Est-ce que 'array_agg (teams.uuid distinct) AS team_uuids' est le bon moyen de supprimer les doublons? – zemirco

+0

@zemirco, oui 'array_agg (distinct teams.uuid)' supprimera les doublons (et triera les uuids en passant). Je suis heureux d'avoir pu aider. – Adam

+0

@zemirco. . . Je me réjouis de votre prochaine question où vous demandez comment obtenir ce retour dans un laps de temps limité. –