Maison  >  Questions et réponses  >  le corps du texte

Comment supprimer les doublons dans la table SQL en fonction de plusieurs champs

J'ai une table de jeu avec la description suivante :

+---------------+-------------+------+-----+---------+----------------+
| Field         | Type        | Null | Key | Default | Extra          |
+---------------+-------------+------+-----+---------+----------------+
| id            | int(11)     | NO   | PRI | NULL    | auto_increment |
| date          | date        | NO   |     | NULL    |                |
| time          | time        | NO   |     | NULL    |                |
| hometeam_id   | int(11)     | NO   | MUL | NULL    |                |
| awayteam_id   | int(11)     | NO   | MUL | NULL    |                |
| locationcity  | varchar(30) | NO   |     | NULL    |                |
| locationstate | varchar(20) | NO   |     | NULL    |                |
+---------------+-------------+------+-----+---------+----------------+

Mais chaque match a une entrée en double quelque part dans le tableau car chaque match figure sur les calendriers des deux équipes. Existe-t-il une instruction SQL que je peux utiliser pour voir et supprimer tous les doublons en fonction des mêmes champs date, heure, hometeam_id, awayteam_id, locationcity et locationstate ?

P粉757556355P粉757556355365 Il y a quelques jours614

répondre à tous(2)je répondrai

  • P粉781235689

    P粉7812356892023-10-21 10:50:13

    Vous pouvez essayer une requête comme celle-ci :

    DELETE FROM table_name AS t1
    WHERE EXISTS (
     SELECT 1 FROM table_name AS t2 
     WHERE t2.date = t1.date 
     AND t2.time = t1.time 
     AND t2.hometeam_id = t1.hometeam_id 
     AND t2.awayteam_id = t1.awayteam_id 
     AND t2.locationcity = t1.locationcity 
     AND t2.id > t1.id )

    Cela ne conservera qu'un seul exemple de chaque instance de jeu avec le plus petit identifiant dans la base de données.

    répondre
    0
  • P粉201448898

    P粉2014488982023-10-21 00:59:19

    Vous devriez pouvoir effectuer une sous-requête corrélée pour supprimer les données. Recherchez toutes les lignes en double et supprimez tout sauf la ligne avec le plus petit identifiant. Pour MYSQL, vous devez utiliser les jointures internes (équivalent fonctionnel à EXISTS) comme suit :

    delete games from games inner join 
        (select  min(id) minid, date, time,
                 hometeam_id, awayteam_id, locationcity, locationstate
         from games 
         group by date, time, hometeam_id, 
                  awayteam_id, locationcity, locationstate
         having count(1) > 1) as duplicates
       on (duplicates.date = games.date
       and duplicates.time = games.time
       and duplicates.hometeam_id = games.hometeam_id
       and duplicates.awayteam_id = games.awayteam_id
       and duplicates.locationcity = games.locationcity
       and duplicates.locationstate = games.locationstate
       and duplicates.minid <> games.id)

    Pour tester, place 从游戏中删除游戏替换为从游戏中选择*. Ne vous contentez pas d'exécuter delete sur la base de données :-)

    répondre
    0
  • Annulerrépondre