如果有人由于重复问题而可以帮助我编写查询以更新我们的订单系统,我将不胜感激。
我们有一个订单表和一个客户表。
我在客户表中标识了一些重复的行,其中唯一行上的电子邮件地址和密码相同-并通过每个表中存在的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
我需要写一个查询:
我从哪里开始?!
我们的系统已修复,因此任何通过登录订购新产品的客户将始终使用可能的最高关联客户编号,因此这实际上是在修复现有数据。
更新:
我从未使用过SQL Fiddle,但是这里有一些示例数据,希望对您有所帮助。
顾客:
客户编号,电子邮件,密码
3272,jwilson @ email.com,9a098e0bade9b4f2ac4ecdf86111cf7e
10001,jwilson @ email.com,9a098e0bade9b4f2ac4ecdf86111cf7e
命令:
订单号,客户号,状态
123457、3272,“ LIVE”
123456,10001,'LIVE'
我需要更新OrderNumber:123457以具有10001的CustomerNumber,而不是3272。
步骤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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句