更新与另一个表的重复项关联的所有行

时间:2015-09-24 16:48:54

标签: mysql

MySQL 5.6

我们有两个表:carsviews

Cars            Views
---+-------     ---+-------
id | desc       id | car_id
---+-------     ---+-------
1  | desc1      1  | 1
2  | Desc1      2  | 2
3  | desc2      3  | 3

问题在于表格汽车中的desc字段。该行必须是唯一的,但我们不幸地允许用户填写大写的值,这使我们遇到了(根据上面的示例)两个重复的行:desc1Desc1。 / p>

解决问题的方法是DELETE复制的汽车,并且只保留第一辆汽车。我们知道如何处理。

我们的问题出现在更新相关表之前,其中一些视图与具有重复desc的汽车相关联(例如将要移除的汽车)。应该更新这些视图,以便分配给第一辆重复的汽车(在这种情况下是汽车ID#1)

UPDATE之后,我们在观看中喜欢这个结果:

Views
---+-------
id | car_id
1  | 1
2  | 1
3  | 3

我们能够获取重复汽车的所有ID并处理删除但我们仍然坚持使用此UPDATE

2 个答案:

答案 0 :(得分:0)

解决方案是创建一个映射表,其中包含描述id的前/后值。

结果应该类似于:

Before | After
---------------
1      | 1
2      | 1
3      | 3

可以使用以下内容创建该表:

SELECT
    cars.id AS before_id,
    fixed.lowest_id AS after_id
FROM cars
JOIN (
    -- The lowest id value for each duplicate description
    SELECT
        MIN(id) AS lowest_id,
        LOWER(desc) AS lower_desc
    FROM cars
    GROUP BY LOWER(desc)
) fixed
ON LOWER(cars.desc) = fixed.lower_desc

然后,您可以将您的视图与该映射表匹配,以提取新的"更正" id值。

答案 1 :(得分:0)

UPDATE Views AS v
JOIN (SELECT c1.id AS oldID, MIN(c2.id) AS newID
      FROM Cars AS c1
      JOIN Cars AS c2 ON LOWER(c1.desc) = LOWER(c2.desc)
      HAVING oldID != newID) AS c
    ON v.car_id = oldID
SET v.car_id = newID

子查询查找包含重复描述的每个ID的主ID。将其与Views表联系起来可提供进行替换所需的信息。