mysql - 合并具有不同值的重复行

标签 mysql

这是对 this question 的更正现在我正确地理解了我需要做什么。

我在 MySQL 中有一个表格,其中包含电影及其放映日期以及其他列中的其他信息。

所以相关列是...

FilmID

FilmName

DateShown

日期存储为 Unix 时间戳。

我目前有多个在不同日期放映的电影实例,但所有其他信息都是相同的。

我需要将重复电影的日期复制到一个新表中,将它们与电影 ID 相匹配。然后我需要从原始表中删除重复的胶片行。

因此,我创建了一个新表 Film_Dates,其中包含列

FilmDateID
FilmID
Date 

任何人都可以帮助使用实际的 SQL 来执行此操作。

谢谢。

最佳答案

首先:

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

这应该会填充您的新表。

alter ignore table films
  add unique (filmid)

这将强制 filmid 的唯一性,并删除所有重复项,仅保留一行。如果此操作因“重复条目”错误而失败,您将需要运行此命令,然后再次尝试更改。

设置 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;

以及(影片名称,所示日期)上的唯一索引

alter ignore table filmdates add unique(filmname, dateshown);

然后我们在 films(filmname) 上添加一个唯一索引 - 因为它是唯一真正重复的值。

alter ignore table films add unique(filmname);

现在我们已经完成设置,我们将使用旧表中的映射值填充新表中的 filmid 列。

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

关于mysql - 合并具有不同值的重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29899177/

相关文章:

php - magic-quotes 是 ON && 一起使用 stripslashes 和 mysql-real-escape-string

mysql - 为多个单词关键字创建索引mysql

php - PDO 一般错误 : 2014 Cannot execute queries while other unbuffered queries are active when trying to LOCK TABLES

加入时删除mysql?

java - 带有 JDBC 临时表的存储过程没有结果集

mysql - 如何在无迁移系统中处理数据库?

php - 基于两个标准(MySQL + 架构 + 数学)展示产品的最佳方式是什么

php - 在 phpMyAdmin 3.3.8.1 中调度 php 脚本

java.sql.SQLException : No value specified for parameter 1 异常

mysql - 选择语句以检索带条件的语言计数