Mysql SQL文件夹实体重复数据消除过程

Mysql SQL文件夹实体重复数据消除过程,mysql,sql,Mysql,Sql,我有一个数据库,其中包含用于创建文件夹/实体类型关系的表。下面是重要的表格和列 表:文件夹 列:id(唯一)、名称、已创建(日期) 表:实体图 列:文件夹id、实体id(映射到唯一的实体id。实体可以位于多个文件夹中) 问题是folder.name列上没有唯一的检查,因此我们有一组名称相似的文件夹(我们不需要)。我想将所有具有相似名称(较低(修剪(名称)))的文件夹下的实体放在已存在的其中一个文件夹下(创建日期最早的文件夹即可)。您可以使用以下方法: UPDATE entity_map, fol

我有一个数据库,其中包含用于创建文件夹/实体类型关系的表。下面是重要的表格和列

表:文件夹 列:id(唯一)、名称、已创建(日期)

表:实体图 列:文件夹id、实体id(映射到唯一的实体id。实体可以位于多个文件夹中)


问题是folder.name列上没有唯一的检查,因此我们有一组名称相似的文件夹(我们不需要)。我想将所有具有相似名称(较低(修剪(名称)))的文件夹下的实体放在已存在的其中一个文件夹下(创建日期最早的文件夹即可)。

您可以使用以下方法:

UPDATE entity_map, folders join 
(
 SELECT MIN(id) id ,(LOWER(TRIM(name))) name 
  FROM folders 
  GROUP BY (LOWER(TRIM(name)))
) AS f1 ON ((f1.id <> folders.id) AND (f1.name=folders.name))
SET entity_map.folder_id=f1.id
WHERE folder_id=folders.id;

如果你已经有了
/foo/BAR
/foo/BAR
,它们按照你的定义是“相似的”,但实际上包含完全不同的东西,那该怎么办?@MarcB也许OP想要一个不区分大小写的“文件系统”。@MarcB我想要一个不区分大小写的系统。我说的文件夹/实体关系是指实体可以放在文件夹下,文件夹实际上没有层次结构。但对于您的示例(如(Bar,Bar,Bar)下有实体,我想将它们分组到创建的第一个“Bar”文件夹下,然后删除不再有实体的额外Bar文件夹。这种方法需要对我的表中的一些其他外部依赖项进行一些更改,但我已将其全部排序。谢谢你的帮助!
DELETE FROM folders 
 USING folders LEFT JOIN entity_map ON (folders.id=entity_map.folder_id) 
 WHERE entity_map.folder_id IS NULL;