2015-04-27 45 views
0

這是對this question的更正,現在我正確理解我需要做什麼。合併具有一個不同值的重複行

我有一張電影的表格,以及它們在MySQL中顯示的日期以及其他列中的其他信息。

所以有關列...

FilmID 

FilmName 

DateShown 

的日期存儲爲Unix的時間戳。

我目前有多個在不同日期顯示的電影實例,但所有其他信息都是相同的。

我需要將複製影片的日期複製到一個新表格中,並將它們匹配到影片ID。然後我需要從原始表中刪除重複的電影行。

所以我創建了一個新表,Film_Dates與列

FilmDateID 
FilmID 
Date 

任何人都可以用實際的SQL做到這一點幫助。

謝謝。

+0

在這些行filmid複製呢? –

+0

對不起,只是有機會回到你身邊......沒有FilmID沒有重複(除了FilmID和Date字段,我的一切都是一樣的) – HowardHosk

回答

1

入手:

insert into filmdateid (filmid, `date`) 
    select filmid, dateshown 
    from films 

,並應填寫新表。

alter ignore table films 
    add unique (filmid) 

這將強制filmid的唯一性,並刪除所有重複項,只保留一行。如果失敗時出現「重複輸入」錯誤,則需要運行此命令,然後再次嘗試更改。

set session old_alter_table=1

,因爲它似乎MySQL是從能夠做這種方式移開。

最後,你需要擺脫你的日期欄。

alter table films 
    drop column dateshown 

請確保您有備份,然後再嘗試這些操作。總是最好安全。

因爲filmid不重複,只有filmname,還有一些額外的步驟

首先,創建filmdates表:

create table filmdates as 
    select filmname, dateshown 
    from films; 

然後添加一個filmid列:

alter table filmdates add column filmid integer; 

(filmname, dateshown)

上的唯一索引
alter ignore table filmdates add unique(filmname, dateshown); 

然後,我們在films(filmname)上添加一個唯一索引 - 因爲它是唯一真正重複的值。

alter ignore table films add unique(filmname); 

現在,我們的設置,我們填充到新表中的列filmid,從舊MACHING值。

update films f 
    inner join filmdates fd 
    on f.filmname = fd.filmname 
    set fd.filmid = f.filmid; 

現在我們只需要清理,並擺脫了冗餘列(films.dateshownfilmdates.filmname)的。

alter table filmdates drop column filmname; 
alter table films drop column dateshown; 

demo here

+0

剛剛有機會看看這個。謝謝你花時間我今晚會嘗試它......但由於FilmId已經是唯一的,我可以將電影名稱複製到新表中,使用該名稱刪除重複項,然後從新表中刪除電影名稱列。我認爲這應該工作! – HowardHosk

+0

啊。 filmid是獨一無二的,這意味着我們只能使用filmname來檢測重複內容嗎? –

+0

是的,只是副本的 – HowardHosk

相關問題