2016-06-29 58 views
1

我有一個多對多的連接在MySQL鏈接角色到任務(三個表:角色,任務& roles_tasks)。每個角色和任務都屬於一個項目。MySQL複製記錄在多人到多人加入

Roles Table 
id | project_id | role 
---|------------|------------- 
1 | 1   | Supervisor 
2 | 1   | Manager 

Tasks Table 
id | project_id | task 
---|------------|------------- 
1 | 1   | Do this 
2 | 1   | Do that 

role_task Table 
role_id | task_id 
----------------- 
1  | 1 
1  | 2 
2  | 1 

我正在尋找一個純SQL的方式來複制角色,任務和它們相關的許多一對多從一個項目加入到不同的項目。我想完成的是這樣的:

Roles Table 
id | project_id | role 
---|------------|------------- 
1 | 1   | Supervisor 
2 | 1   | Manager 
3 | 2   | Supervisor 
4 | 2   | Manager 

Tasks Table 
id | project_id | task 
---|------------|------------- 
1 | 1   | Do this 
2 | 1   | Do that 
3 | 2   | Do this 
4 | 2   | Do that 

role_task Table 
role_id | task_id 
--------|-------- 
1  | 1 
1  | 2 
2  | 1 
3  | 3 
3  | 4 
4  | 3 

我可以在沒有問題的情況下複製/複製角色表和任務表中的數據。但是,如何將role_task表複製到新的角色ID和任務ID?我可以在PHP中用循環和抓取插入的id來完成,但是更喜歡純粹的SQL解決方案。由於

+0

你有3個表,即角色,任務和role_task? – jarlh

+0

我不明白你期望從數據庫得到的確切結果是什麼。 –

回答

0

提供的任務和角色表是自動遞增你可以做類似下面的...

注意我已經使用3作爲PROJECT_ID,但是這可以從數據庫中另一個表的查找..

INSERT INTO tasks (project_id, task) SELECT DISTINCT 3 ,`task` FROM `tasks`; 

INSERT INTO roles (project_id, role) SELECT DISTINCT 3,`role` FROM `roles`; 

INSERT INTO role_tasks (task_id, role_id) SELECT tasks.id AS task_id, roles.id AS role_id FROM `tasks` CROSS JOIN `roles` WHERE tasks.project_id=3 AND roles.project_id=3 
+0

role_task表中的數據不能通過交叉連接構建 - 這不是一切事物之間的關係。在我的例子中,'經理'(id = 2)只分配了任務'做這個'(id = 1),而不是任務'做那個'(id = 2)。 – Jaconat

1

的唯一明智的方法我能做到這一點是一個字段添加到保存原記錄的ID的角色和任務表。該role_task表保持不變,但我的其他兩個表,現在是這樣的:

roles table 
id | project_id | original_id | role 
---|------------|-------------|----- 
1 | 1   | 0   | Supervisor 
2 | 1   | 0   | Manager 

tasks table 
id | project_id | original_id | task 
---|------------|-------------|----- 
1 | 1   | 0   | Do this 
2 | 1   | 0   | Do that 

因此,重複角色和任務的3 PROJECT_ID的SQL是:

INSERT roles 
SELECT NULL, 3, id, role FROM Roles WHERE project_id = 1 

INSERT tasks 
SELECT NULL, 3, id, task FROM Tasks WHERE project_id = 1 

然後,複製多對多表:

INSERT role_task 
SELECT r.id, t.id 
FROM role_task AS rt 
LEFT JOIN roles AS r ON rt.role_id = r.original_id 
LEFT JOIN tasks AS t ON rt.task_id = t.original_id 
WHERE r.project_id = 3 
AND t.project_id = 3