Comment supprimer les doublons dans la table SQL en fonction de plusieurs champs
P粉757556355
P粉757556355 2023-10-20 12:01:14
0
2
642

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粉757556355
P粉757556355

répondre à tous(2)
P粉781235689

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.

P粉201448898

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 :-)

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal