2013-07-10 23 views
2

我有一個contacts表,其中有一個自動遞增主鍵idpartner_id列上的自引用一對一關係。MySQL - 僅在共享一個共享值的兩列中的一列中設置值

我從各種來源的CSV導入了很多聯繫人,其中一些來源很差,所以我不得不應用一些智慧來確定誰是誰的伴侶,如果他們有一個。

我已經到了導入之後的階段,我有聯繫人表中的行,並且我確定要成爲合作伙伴的任何對都在import_group列中共享該對的唯一值。

我現在被困在編寫查詢來執行以下操作:

如果兩行共享import_group相同的值,設置第一個兩排的partner_id到的第二的id兩行,但不要將第二行的partner_id設置爲第一行的id。由於引用此數據庫的應用程序的設計,此結構是一項要求。

這將在包含最多約4000000行的表上運行,在由系統管理員運行的手動導入過程中每月少於一次,因此效率不是此查詢的特定目標。

我該怎麼辦?

回答

2

對於自連接,如果按id排序,則可以使用WHERE子句來確保每對只有一對。例如,

UPDATE contacts as c1 
    JOIN contacts as c2 
     ON c2.import_group = c1.import_group 
    SET c1.partner_id = c2.id 
WHERE c1.id < c2.id; 

我無法訪問SQL小提琴,所以這裏是我測試過它:

create table contacts (id int, import_group int, partner_id int); 
insert into contacts values (1, NULL, NULL), (2, 100, NULL), (3, 100, NULL), (4, NULL, NULL), (5, 101, NULL), (6, NULL, NULL), (7, 101, NULL); 

select * from contacts; 
+------+--------------+---------+ 
| id | import_group | partner | 
+------+--------------+---------+ 
| 1 |   NULL | NULL | 
| 2 |   100 |  3 | 
| 3 |   100 | NULL | 
| 4 |   NULL | NULL | 
| 5 |   101 |  7 | 
| 6 |   NULL | NULL | 
| 7 |   101 | NULL | 
+------+--------------+---------+ 
7 rows in set (0.00 sec) 
+0

似乎很容易當別人這樣做...謝謝你=] – bdx

0

可以識別所有的合作伙伴自連接。那麼你只想設置一個「低」contact.id

以下更新會自行加入contact以找到合作伙伴。然後它有一個不平等的,因此保持第一行的set

update contacts c join 
     contacts cpart 
     on c.import_group = cpart.import_group and 
      c.id < cpart.id 
    set c.partner_id = cpart.id; 

注:這是假定所有的合作伙伴關係是二元的。如果你有多方合作伙伴關係,那麼關於數據應該是什麼樣的,需要更多的信息。