2014-10-10 49 views
0

我将大规模感激,如果有人可以帮我写一个查询来更新我们的订单系统,由于重复数据删除的问题那里duplictaes。如何更新一个表中的行中的另一个

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

我在我们的客户表中找到了一些重复的行,其中电子邮件地址和密码在唯一行上是相同的 - 并且与每个表中存在的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”一栏是最高的“CUSTOMERNUMBER”
  • 这里的“客户”表中有超过1行与有一个 相同的“电子邮件”和“密码”列

我从哪里开始?

我们的系统已经修复,因此,任何客户的订单通过登录将始终使用最高的相关CUSTOMERNUMBER所以这真的是有关解决现有数据的新产品。

UPDATE:

我从来没有使用SQL小提琴,但这里是我希望能帮助你..帮我一些样本数据!

客户:

CUSTOMERNUMBER,电子邮件,密码

3272,[email protected],9a098e0bade9b4f2ac4ecdf86111cf7e

10001,[email protected],9a098e0bade9b4f2ac4ecdf86111cf7e

订单:

订单编号,CUSTOMERNUMBER,状态

123457,3272, 'LIVE'

123456,10001, 'LIVE'

我需要更新订单号码:123457有10001为CustomerNumber,不是3272。

+1

你能否提供与sqlFiddle一些示例数据? – 2014-10-10 09:46:06

+0

sql小提琴将非常有用! – developerCK 2014-10-10 09:54:22

+0

示例数据添加到问题中。感谢您的期待! – 2014-10-10 10:02:50

回答

1

步骤1:创建临时列来存储正确CUSTOMERNUMBER

ALTER TABLE scustomers 
    ADD COLUMN id_tmp INT NOT NULL; 

步骤2:检索正确CUSTOMERNUMBER

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:用正确CUSTOMERNUMBER更新顺序表

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; 
+0

我会放弃并回报。谢谢(到目前为止!) – 2014-10-10 11:47:09

+0

第2步:[Err] 1054 - 'on clause'中的未知列'duplicate.emailadress' – 2014-10-10 12:33:30

+0

我忘了“d” - > emailaddress – 2014-10-10 12:51:01

1

我只是给你需要编写循环

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   [email protected] 

这毕竟副本会在SQL查询想法field.explode新的customernumber获取该数组中的最后一个值(例如: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 
相关问题