J'essaie de trouver les enregistrements dupliqués disponibles dans la table fixtures, j'ai donc écrit cette requête:

SELECT *
FROM fixtures f
INNER JOIN (SELECT *
           FROM fixtures s
           GROUP BY s.match_id
           HAVING COUNT(player_id) > 1) dup
       ON m.match_id = dup.match_id;

Mais la requête est vraiment lente et il n'y a que 1000 enregistrements dans la table. Voici les enregistrements disponibles:

player_id | match_id  | team_id
  19014       2506172    12573
  19014       2506172    12573
  19015       2506172    12573
  19016       2506172    12573
  19016       2506172    12573
  19016       2506172    12573

La requête doit retourner comme dupliqué le lecteur 19016 et 19014, ce que j'ai fait de mal?

sql
0
Spartaok 20 nov. 2018 à 17:44

3 réponses

Meilleure réponse

Si vous recherchez des dupes dans les trois colonnes, je ne vois pas pourquoi vous avez besoin d'une jointure.

SELECT player_id, match_id, team_id, count(*) 
FROM fixtures
GROUP BY player_id, match_id, team_id
HAVING COUNT(*) > 1
1
dfundako 20 nov. 2018 à 14:47

Pourquoi ne pas simplement faire aggregation? :

SELECT s.player_id, s.match_id, s.team_id
FROM fixtures s
GROUP BY s.player_id, s.match_id, s.team_id
HAVING COUNT(*) > 1;

Cependant, si je réexamine la question, je suggère:

SELECT s.player_id
FROM fixtures s
GROUP BY s.player_id
HAVING COUNT(*) > 1;
0
Yogesh Sharma 20 nov. 2018 à 14:47

Je pense que votre navigateur db a limité le jeu de résultats. (1000 lignes)

SELECT f2.*
FROM fixtures f
JOIN fixtures f2 on (f.match_id = f2.match_id and f.player_id<f2.player_id)

Ce sera plus rapide de ne pas lister les doublons avec le playerid le plus bas. Mais tous les identifiants de correspondance dupliqués sont dans le résultat.

0
László Tóth 20 nov. 2018 à 14:52