2016-05-25 5 views
0

ムービーデータベースを扱うMySQL 5.7のプロジェクトで作業しています。私は(私は変更することが許されておりませんことを)次の表があります。列が同じ値を持ち、それらの行をMySQLの同じプライマリキーに関連付けるときに行を削除する

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; 

私はいくつかの有効なgenres反映するために更新されなければならなかったレコードを持っていました。残念ながら、genres.namegenres.idが異なるにもかかわらず、重複しています。私がしたいのは、すべてgenres.nameを単一のgenres.idgenres.nameに統合することです。私は、このテーブルがある場合たとえば、:

genres (old) 
================== 
id | name  | 
================== 
2 | Romance | 
------------------ 
6 | Romance | 
------------------ 
45 | Romance | 
================== 

を私は単一のエントリのみgenres.id = 2genres.name = 'Romance'で終わるしたいです。

DELETE FROM genres 
WHERE genres.id NOT IN (SELECT * 
         FROM (SELECT MIN(g.id) 
          FROM genres g 
          GROUP BY g.name) 
         x); 

を私はまたmoviesテーブルが壊れないようにgenres.id変更を反映するためにgenres_in_movies.genre_idを更新できるようにしたい:

私は次のクエリで簡単にこれを行うことができます。では、どうすればgenres_in_moviesテーブルも更新できますか?

答えて

1

まず更新genres_in_movies

update genres_in_movies gin join 
     genres g 
     on gin.genre_id = g.id join 
     (select g2.name, min(g2.id) as minid 
     from genres g2 
     group by g2.name 
     ) g2 
     on g2.name = g.name and g2.minid <> g.id 
    set gin.genre_id = g2.minid; 

はその後、削除を行います。

ところで、あなたはLEFT JOINを使用してDELETEを言い換えることができます迅速な答えを

DELETE g 
    FROM genres g LEFT JOIN 
     (SELECT MIN(g.id) as minid 
      FROM genres g 
      GROUP BY g.name 
     ) gmin 
     ON g.id = gmin.minid 
    WHERE gmin.minid IS NULL; 
+0

感謝を。残念ながら、最初のアップデートは機能しません。私は 'ERROR:1054、 'on clause'に 'g2.name'という未知の列がある – Alex

関連する問題