Maison > Questions et réponses > le corps du texte
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粉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.
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 :-)