2014-10-10 97 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 
相關問題