sql - Removing rows when column has same value, and relating those rows to the same primary key in MySQL -
i'm working on project mysql 5.7 deals movies database. have following tables (that not allowed change):
create table `movies` ( `id` int not null auto_increment, `title` varchar(100) not null default '', `director` varchar(100) not null default '', primary key(`id`) ) engine=innodb default charset=latin1; create table `genres` ( `id` int not null auto_increment, `name` varchar(32) not null default '', primary key (`id`) ) engine=innodb default charset=latin1; create table `genres_in_movies` ( `genre_id` int not null, `movie_id` int not null, foreign key (`genre_id`) references `genres`(`id`), foreign key (`movie_id`) references `movies`(`id`) ) engine=innodb default charset=latin1; i had records had updated reflect valid genres. unfortunately have bunch of duplicate genres.name though genres.id differs. consolidate equivalent genres.name single genres.id , genres.name. example, if have table:
genres (old) ================== id | name | ================== 2 | romance | ------------------ 6 | romance | ------------------ 45 | romance | ================== i want end single entry genres.id = 2 , genres.name = 'romance'.
i following query:
delete genres genres.id not in (select * (select min(g.id) genres g group g.name) x); but want able update genres_in_movies.genre_id reflect genres.id change movies table doesn't break. how can update genres_in_movies table well?
first update genres_in_movies:
update genres_in_movies gin join genres g on gin.genre_id = g.id join (select g2.name, min(g2.id) minid genres g2 group g2.name ) g2 on g2.name = g.name , g2.minid <> g.id set gin.genre_id = g2.minid; then delete.
btw, can rephrase delete using left join:
delete g genres g left join (select min(g.id) minid genres g group g.name ) gmin on g.id = gmin.minid gmin.minid null;
Comments
Post a Comment