如何更新一个表中的行,而另一个表则存在重复


How to UPDATE rows in one table where there duplictaes in another

如果有人能帮我写一个查询来更新我们的订单系统,我将不胜感激。

我们有一张订单表和一张客户表。

我在我们的客户表中发现了一些重复的行,其中电子邮件地址和密码在唯一的行上是相同的,并且通过每个表中存在的CustomerNumber与唯一的实时订单相关联。这很糟糕,因为当客户登录到他们的帐户时,他们不会看到所有订单,而是只会看到与最高客户ID相关的订单(请参阅下面的登录SQL)

识别重复的用户帐户:

SELECT
    emailaddress,
    PASSWORD,
    count(*)
FROM
    scustomers
JOIN orders ON orders.customernumber = customers.CustomerNumber
WHERE Completed = 1
GROUP BY
    emailaddress,
    PASSWORD
HAVING
    count(*) > 1

登录SQL:

SELECT * FROM scustomers WHERE EmailAddress = :EmailAddress AND (Password = :Password) ORDER BY CustomerNumber DESC LIMIT 0,1

我需要写一个查询:

  • 更新"订单"表
  • 更新"客户编号"列
  • 将"CustomerNumber"列设置为最高的"CustomerNumber"
  • 其中"customers"表有1行以上,具有"电子邮件"answers"密码"列相同

我从哪里开始?!

我们的系统已经修复,因此任何通过登录订购新产品的客户都将始终使用尽可能高的关联客户编号,因此这实际上是为了修复现有数据。

更新:

我从未使用过SQL Fiddle,但这里有一些示例数据,我希望能对您有所帮助。。帮帮我!

客户:

客户编号、电子邮件、密码

3272中,jwilson@email.com,9a098e0bade9b4f2c4ecdf86111cf7e

10001,jwilson@email.com,9a098e0bade9b4f2c4ecdf86111cf7e

订单:

订单号、客户号、状态

1234573272,"实时"

123456,10001,"实时"

我需要更新OrderNumber:123457,使CustomerNumber为10001,而不是3272。

步骤1:创建一个临时列来存储正确的CustomerNumber

ALTER TABLE scustomers
    ADD COLUMN id_tmp INT NOT NULL;

步骤2:检索正确的客户编号

UPDATE scustomers
    INNER JOIN 
        (
        SELECT
            emailaddress,
            PASSWORD,
            MAX(CustomerNumber) AS id
        FROM
            scustomers
        GROUP BY
            emailaddress,
            PASSWORD
        ) AS duplicate ON scustomers.emailaddress = duplicate.emailaddress AND scustomers.PASSWORD = duplicate.PASSWORD
    SET id_tmp = id;

步骤3:使用正确的客户编号更新订单表

UPDATE orders
    INNER JOIN scustomers ON orders.customerNumber = customers.CustomerNumber
    SET orders.customernumber = id_tmp;

步骤4:删除重复的客户

DELETE FROM scustomers
    WHERE customernumber <> id_tmp;

步骤5:移除临时列

ALTER TABLE scustomers
    DROP COLUMN id_tmp;

我只是给出了您需要为循环编写的sql查询的想法

 SELECT GROUP_CONCAT( customernumber) , i.email
 FROM scustomers i INNER JOIN ( SELECT k.email FROM scustomers k GROUP BY k.email
 HAVING COUNT( `customernumber` ) >1 )j ON i.email = j.email GROUP BY i.email
 Out put :
   ----------------------------
    customernumber    Email 
   ---------------------------
    1,2,3            ss@ss.ss

在此之后,所有重复项都将出现在字段中。explode新客户编号get该数组中的最后一个值(例如:3是最后一个数值)

update  `orders` set `customernumber`='last array value(Ex: 3)' WHERE `customernumber` in (customernumber from above  query(1,2,3) )

对于删除重复记录

DELETE n1 FROM scustomers n1, scustomers n2 WHERE n1.customernumber< n2.customernumber AND n1.email= n2.email