我有一个数据库,其中包含用于创建文件夹/实体类型关系的表。重要的表格和栏目如下。
列:id(唯一),名称,创建(日期)
列:folder_id,entity_id(映射到唯一的entity_id。实体可以在多个文件夹中)。
问题是对folder.name列没有唯一的检查,所以我们有一堆名称相似的文件夹(我们不想要)。我想将具有相似名称的所有文件夹下的实体(较低(修剪(名称)))放在已存在的文件夹之下(具有最早创建日期的文件夹)。
答案 0 :(得分:0)
您可以使用以下内容:
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;
这假设folders.id为AUTO_INCREMENT
,并且不考虑文件夹创建日期。如果您在上述单个事务中运行以下内容,它还将删除空文件夹:
DELETE FROM folders
USING folders LEFT JOIN entity_map ON (folders.id=entity_map.folder_id)
WHERE entity_map.folder_id IS NULL;